shellscript
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
shellscript [2020/04/01 06:12] – [変数参照] nullpon | shellscript [2024/08/20 15:31] (現在) – nullpon | ||
---|---|---|---|
行 1: | 行 1: | ||
====== ShellScript ====== | ====== ShellScript ====== | ||
+ | ===== bash ===== | ||
+ | |||
+ | シェルスクリプトは基本的にはbashをターゲットに作成する。 | ||
+ | |||
+ | < | ||
+ | #!/bin/bash -eu | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | shebangは''# | ||
+ | |||
+ | dockerで起動する場合、alpineにはbashが入ってないため、ubuntu-slimをベースイメージにする。 | ||
===== shの実行オプション ===== | ===== shの実行オプション ===== | ||
行 6: | 行 19: | ||
* -x 変数を展開した状態で実際に実行されるコマンドを標準エラー出力に書き出す | * -x 変数を展開した状態で実際に実行されるコマンドを標準エラー出力に書き出す | ||
* -u 未定義の変数があれば処理を打ち切る | * -u 未定義の変数があれば処理を打ち切る | ||
+ | * -C noclobberオプションを有効にする(リダイレクトでファイルを上書きしようとするとエラーになる、追記はOK) | ||
shebangに追加されることが多い | shebangに追加されることが多い | ||
行 42: | 行 56: | ||
==== [[ ]] ==== | ==== [[ ]] ==== | ||
- | bashの拡張、bashならこちらを使った方がバグが少ないので良い | + | testコマンドのbash拡張 |
単語分割やパス展開しないので、変数をクオートで囲む必要ない | 単語分割やパス展開しないので、変数をクオートで囲む必要ない | ||
行 65: | 行 79: | ||
read line | read line | ||
echo $line | echo $line | ||
+ | |||
+ | プロンプトを出して入力を促す | ||
+ | |||
+ | echo -n "User Name: " | ||
+ | read username | ||
+ | echo $username | ||
+ | | ||
+ | zshでは以下のようにかける | ||
+ | |||
+ | read " | ||
+ | echo $username | ||
+ | | ||
+ | 入力値をマスクしたい場合はread -s(決定時の改行も出力されなくなるのでechoを挟むとよい) | ||
+ | |||
+ | read -s " | ||
+ | tty -s && echo | ||
+ | echo $password | shasum -a 256 | ||
+ | |||
+ | |||
| | ||
標準入力が尽きるまで行を読み取る(Ctrl-DでEOFを送信) | 標準入力が尽きるまで行を読み取る(Ctrl-DでEOFを送信) | ||
行 171: | 行 204: | ||
< | < | ||
- | $ var=abcdefg | + | x=abcdefg |
- | $ echo ${var:1:4} | + | echo ${x:1:4} # => bcde |
- | bcde | + | |
</ | </ | ||
行 179: | 行 211: | ||
< | < | ||
- | $ var=hogehogefugafuga | + | x=hogehogefugafuga |
- | $ echo ${var#hoge} | + | echo ${x# |
- | hogefugafuga | + | |
- | $ echo ${var%fuga} | + | echo ${x%fuga} |
- | hogehogefuga | + | |
- | $ echo ${var#h*e} | + | echo ${x#h*e} |
- | hogefugafuga | + | |
- | $ echo ${var##h*e} | + | echo ${x##h*e} # => fugafuga |
- | fugafuga | + | |
- | $ echo ${var%f*a} | + | echo ${x%f*a} # => hogehogefuga |
- | hogehogefuga | + | |
- | $ echo ${var%%f*a} | + | echo ${x%%f*a} |
- | hogehoge | + | |
</ | </ | ||
- | |||
- | *をワイルドカードとして使用可能、%%、## | ||
文字列置換 | 文字列置換 | ||
< | < | ||
- | $ echo ${var/ | + | echo ${var/ |
- | HOGEhogefugafuga | + | |
- | $ echo ${var// | + | echo ${var// |
- | HOGEHOGEfugafuga | + | |
</ | </ | ||
- | 使用例:まとめてリネーム、拡張子を外す | + | 使用例:まとめてリネーム、拡張子まとめて変更 |
< | < | ||
$ ls | $ ls | ||
- | a.php.txt b.php.txt c.php.txt | + | a.txt b.txt c.txt |
- | $ for i in `ls`; do mv $i ${i%.txt}; done | + | $ for i in `ls`; do mv $i ${i%.txt}.php; done |
$ls | $ls | ||
行 323: | 行 345: | ||
</ | </ | ||
- | '' | + | '' |
+ | |||
+ | |||
+ | '' | ||
< | < | ||
行 361: | 行 386: | ||
===== ヒアドキュメント ===== | ===== ヒアドキュメント ===== | ||
- | ==== 変数に格納 | + | 変数に格納 |
<code shellscript> | <code shellscript> | ||
- | hoge=$(<< ' | + | val=$(cat << ' |
- | a = ARGV.first.split(" | + | hoge |
- | puts a.gsub(/ | + | fuga |
+ | piyo | ||
EOS | EOS | ||
) | ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | 標準入力に渡す | ||
+ | |||
+ | <code shellscript> | ||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done << ' | ||
+ | hoge | ||
+ | fuga | ||
+ | piyo | ||
+ | EOS | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | 一度変数を経由する。''<<<'' | ||
+ | |||
+ | <code shellscript> | ||
+ | val=$(cat << ' | ||
+ | hoge | ||
+ | fuga | ||
+ | piyo | ||
+ | EOS | ||
+ | ) | ||
+ | |||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done <<< | ||
+ | </ | ||
+ | |||
+ | クオートの有無は変数展開するかしないか | ||
+ | |||
+ | <code shellscript> | ||
+ | val=' | ||
+ | |||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done << " | ||
+ | ${val} | ||
+ | ${val} | ||
+ | ${val} | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | クオートありの場合は変数展開されずに以下のように出力される | ||
+ | |||
+ | < | ||
+ | ${val} | ||
+ | ${val} | ||
+ | ${val} | ||
</ | </ | ||
shellscript.1585721540.txt.gz · 最終更新: 2020/04/01 06:12 by nullpon