- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Bash へ行く。
- 1 (2018-03-18 (日) 20:49:33)
- 2 (2018-03-20 (火) 09:06:21)
- 3 (2019-01-06 (日) 09:24:42)
- 4 (2019-01-12 (土) 21:48:28)
- 5 (2019-01-31 (木) 07:20:51)
- 6 (2019-02-01 (金) 09:43:35)
- 7 (2019-02-02 (土) 09:46:16)
- 8 (2019-02-03 (日) 02:20:06)
- 9 (2019-02-03 (日) 05:36:51)
- 10 (2019-02-04 (月) 05:00:39)
- 11 (2019-02-07 (木) 08:53:49)
- 12 (2019-02-10 (日) 00:28:39)
- 13 (2019-02-10 (日) 03:20:26)
- 14 (2019-02-10 (日) 08:34:09)
- 15 (2019-02-25 (月) 04:44:27)
- 16 (2019-02-25 (月) 08:11:51)
- 17 (2019-02-26 (火) 08:06:29)
- 18 (2019-02-27 (水) 10:02:53)
- 19 (2019-02-28 (木) 09:38:29)
- 20 (2019-03-05 (火) 09:54:13)
- 21 (2019-03-06 (水) 09:17:25)
- 22 (2019-03-07 (木) 07:41:27)
- 23 (2019-03-09 (土) 09:17:38)
- 24 (2019-03-09 (土) 23:41:50)
- 25 (2019-03-10 (日) 07:31:44)
- 26 (2019-03-10 (日) 10:33:46)
- 27 (2019-03-10 (日) 19:16:58)
- 28 (2019-03-17 (日) 07:32:30)
- 29 (2019-03-17 (日) 19:35:17)
- 30 (2019-03-18 (月) 01:12:00)
- 31 (2019-03-22 (金) 07:12:56)
- 32 (2019-03-23 (土) 22:12:31)
- 33 (2019-03-24 (日) 09:14:12)
- 34 (2019-03-26 (火) 08:55:27)
- 35 (2019-03-27 (水) 09:31:09)
- 36 (2019-03-28 (木) 06:30:44)
- 37 (2019-03-29 (金) 09:01:02)
- 38 (2019-03-30 (土) 09:06:01)
- 39 (2019-03-30 (土) 20:22:20)
- 40 (2019-04-01 (月) 08:03:58)
- 41 (2019-04-04 (木) 08:48:41)
- 42 (2019-04-06 (土) 21:07:53)
- 43 (2019-04-11 (木) 06:27:12)
- 44 (2019-05-01 (水) 22:54:09)
- 45 (2019-05-02 (木) 07:50:54)
- 46 (2019-05-02 (木) 19:19:20)
- 47 (2019-05-04 (土) 06:04:16)
- 48 (2019-05-04 (土) 07:35:38)
- 49 (2019-05-06 (月) 07:23:05)
- 50 (2019-07-25 (木) 07:54:44)
- 51 (2020-01-31 (金) 21:32:23)
- パラメータ展開
- ${parameter}
- ${parameter:-word}
- ${parameter:=word}
- ${parameter:?word}
- ${parameter:+word}
- ${parameter:offset}、${parameter:offset:length}
- ${!prefix*}、${!prefix@}
- ${!name[*]}、${!name[@]}
- ${#parameter}
- ${parameter#word}、${parameter##word}
- ${parameter%word}、${parameter%%word}
- ${parameter/pattern/string}
- ${parameter^pattern}、${parameter^^pattern}
- ${parameter,pattern}、${parameter,,pattern}
- プロセス置換
- execを使った入出力のリダイレクト
- 参考リンク
パラメータ展開 †
${parameter} †
parameterの値に置換される。
# --- commands --- rm "job.done" { sleep 3 && touch job.done; } & retry=0 until [ -f "job.done" ] do sleep 1 ((retry+=1)) if [ $retry -gt 5 ]; then echo "exceeded retry max:5." exit 1 fi done echo "success" # --- output --- success
${parameter:-word} †
parameter が設定されていないか空文字列であれば、 wordを展開したものに置換される。そうでなければ、 parameter の値に置換される。
変数のデフォルト値を設定したい場合などによく使う。
# --- commands --- touch "job.lock" { sleep 3 && rm job.lock; } & retry=0 while [ -f "job.lock" ] do sleep 1 ((retry+=1)) if [ $retry -gt 5 ]; then echo "exceeded retry max:5." exit 1 fi done echo "job done" # --- output --- job done
${parameter:=word} †
parameterが設定されていないか空文字列であれば、 wordを展開したものがparameter に代入される。その後、parameter の値への置換が行われる。
# --- commands --- for w in {localhost,192.168.3.4}; do echo "$w" done # --- output --- localhost 192.168.3.4 # --- commands --- for ((i=0; i < 5;i++)); do echo $i done # --- output --- 0 1 2 3 4
${parameter:?word} †
- parameterが空文字列または設定されていない場合、word を展開したものが標準エラー出力に出力される。
- wordがなければ パラメータが空文字列または設定されていないことを示すメッセージが標準エラー出力に出力される。
- 対話的シェルでなければ、 シェルは終了する。
- parameterに空文字列以外が設定されていれば、 parameter 値への置換が行われる。
if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
${parameter:+word} †
parameter が空文字列または設定されていなければ、空文字列に置換される。そうでなければ word を展開したものに置換される。${parameter:-word} の逆。
# --- commands --- # Arithmetic expression (( 0 )); echo $? (( 1 )); echo $? #1 ls job.done if ( cd . && test -f job.done ); then echo "job.done found" fi #2 i=0 (( i >= 0 )) ; echo $? if (( i >= 0 )); then echo "i is more than 0" fi #3 i=0 (( (i >= 0) && (i < 1) )) ; echo $? !(( (i >= 0) && (i < 1) )) ; echo $? if !(( (i >= 0) && (i < 1) )); then echo "i is not (i >= 0) && (i < 1)" else echo "i is (i >= 0) && (i < 1)" fi #4 log="FATAL: unexpected error" if [[ "$log" =~ ^FATAL ]]; then echo "Error detected!" fi # --- output --- # Arithmetic expression 1 0 #1 job.done job.done found #2 0 i is more than 0 #3 0 1 i is (i >= 0) && (i < 1) #4 Error detected!
${parameter:offset}、${parameter:offset:length} †
部分文字列の展開を行なう。length指定がある場合は、parameter を展開したものから最大 length 文字を取り出す。length指定がない場合は、指定したインデックスから末尾までの文字を取り出す。配列の場合は、指定したインデックスからlengthで指定される要素を取り出す。
case word in [ [(] pattern [| pattern]…) command-list ;;]… esac
${!prefix*}、${!prefix@} †
prefix で始まる全ての変数の名前に展開して、 IFS 特殊変数の最初の文字によって区切る。
# --- commands --- do_case() { echo "cond: $cond" case "$cond" in start) echo "match start" ;; s*p) echo "match s*p" ;; {a,b,c}) echo "match {a,b,c}" ;; [0-5]*|[6-9]+) echo "match [0-5]*|[6-9]+" ;; (~) echo "match ~" ;& (fallback) echo "match fallback" ;; ($USER) echo "match \$USER" ;;& (/$USER) echo "match /\$USER" ;; ($USER*) echo "match \$USER*" ;; *) # default echo "cond does not match anything" ;; esac } do_case2() { case $cond in not) test "1" = "0" ;; esac echo "status: $?" } #1 cond="start" do_case #2 cond="stop" do_case #3 cond="a b c" do_case cond={a,b,c} do_case #4 cond="123" do_case cond="678" do_case #5 cond="unknown" do_case #6 cond="$HOME" do_case #7 cond="$USER" do_case #8 cond="not" do_case2 cond="notmatch" do_case2 # --- output --- #1 cond: start match start #2 cond: stop match s*p #3 cond: a b c cond does not match anything cond: {a,b,c} match {a,b,c} #4 cond: 123 match [0-5]*|[6-9]+ cond: 678 cond does not match anything #5 cond: unknown cond does not match anything #6 cond: /home/guest match ~ match fallback #7 cond: guest match $USER match $USER* #8 status: 1 status: 0
${!name[*]}、${!name[@]} †
配列のキーのリストに展開される。ハッシュの場合は、キーを取り出すことができる。配列の場合は、インデックスとなる。*と@の違いは、ダブルクォートで囲まれた場合の展開方法が異なる。
select name [in words …]; do commands; done
${#parameter} †
パラメータの長さを示す。文字列の場合は文字列の長さ、配列の場合は要素数。
select item in dog apple orange; do echo you picked $item \($REPLY\) break; done # ----- output ----- 1) dog 2) apple 3) orange #? 1 you picked dog (1)
${parameter#word}、${parameter##word} †
${parameter%word}、${parameter%%word} †
${parameter/pattern/string} †
${parameter^pattern}、${parameter^^pattern} †
${parameter,pattern}、${parameter,,pattern} †
プロセス置換 †
>(list)
は、ファイルへの出力がlistへの入力となる。<(list)
は、listの出力がファイルへの入力となる。
サンプル lsの結果で*.shファイルのみを出力
select item in dog apple orange; do echo you picked $item \($REPLY\) break done # ----- output ----- 1) dog 2) apple 3) orange #? 4 you picked (4)
サンプル a.txtとb.txtをdiffの入力ファイルとして比較
select item in dog apple orange; do echo you picked $item \($REPLY\) break done # ----- output ----- 1) dog 2) apple 3) orange #? 1) dog 2) apple 3) orange #?
サンプル
PS3="Please select a package you will install: " menus=(package1 package2 package3) select item in ${menus[@]}; do test -z "$item" && { echo "invalid package, please select again" continue } echo "ok, install $item ($REPLY)" break done # ----- output ----- 1) package1 2) package2 3) package3 Please select a package you will install: hoge invalid package, please select again Please select a package you will install: 1 ok, install package1 (1)
execを使った入出力のリダイレクト †
execコマンドでリダイレクトだけを指定すると、シェル自身のファイル記述子とデバイスの対応を変更することができる。
例 execを使った入力のリダイレクト †
i=0; (( ++i )) ; echo $? #=> 0 i=1; (( --i )) ; echo $? #=> 1 echo $(( 0 )) #=> 0 (( 0 )) ; echo $? #=> 1 echo $(( 1 )) #=> 1 (( 1 )) ; echo $? #=> 0 echo $(( 1 - 1 )) #=> 0 (( 1 - 1 )) ; echo $? #=> 1 echo $(( 0 + 1 )) #=> 1 (( 0 + 1 )) ; echo $? #=> 0 echo $(( 1**2 )) #=> 1 (( 1**2 )) ; echo $? #=> 0 echo $(( 1 * 0 )) #=> 0 (( 1 * 0 )) ; echo $? #=> 1 echo $(( 0 / 1 )) #=> 0 (( 0 / 1 )) ; echo $? #=> 1 echo $(( 3 % 3 )) #=> 0 (( 3 % 3 )) ; echo $? #=> 1 echo $(( 3 % 1 )) #=> 0 (( 3 % 1 )) ; echo $? #=> 1 echo $(( 2 >> 1 )) #=> 1 (( 2 >> 1 )) ; echo $? #=> 0 echo $(( 1 << 1 )) #=> 2 (( 1 << 1 )) ; echo $? #=> 0 echo $(( 1 >= 0 )) #=> 1 (( 1 >= 0 )) ; echo $? #=> 0 echo $(( 0 <= 0 )) #=> 1 (( 0 <= 0 )) ; echo $? #=> 0 echo $(( 1 > 0 )) #=> 1 (( 1 > 0 )) ; echo $? #=> 0 echo $(( 0 < 1 )) #=> 1 (( 0 < 1 )) ; echo $? #=> 0 echo $(( 1 == 1 )) #=> 1 (( 1 == 1 )) ; echo $? #=> 0 echo $(( 1 != 0 )) #=> 1 (( 1 != 0 )) ; echo $? #=> 0 echo $(( 1 & 3 )) #=> 1 (( 1 & 3 )) ; echo $? #=> 0 echo $(( 1 & 0 )) #=> 0 (( 1 & 0 )) ; echo $? #=> 1 echo $(( 1 ^ 0 )) #=> 1 (( 1 ^ 0 )) ; echo $? #=> 0 echo $(( 1 ^ 1 )) #=> 0 (( 1 ^ 1 )) ; echo $? #=> 1 echo $(( 0 | 1 )) #=> 1 (( 0 | 1 )) ; echo $? #=> 0 echo $(( 1 | 1 )) #=> 1 (( 1 | 1 )) ; echo $? #=> 0 echo $(( 1 >= 0 && 1 <= 2 )) #=> 1 (( 1 >= 0 && 1 <= 2 )) ; echo $? #=> 0 echo $(( 0 >= 1 || 1 <= 2 )) #=> 1 (( 0 >= 1 || 1 <= 2 )) ; echo $? #=> 0 echo $(( 1 ? 0 : 1 )) #=> 0 (( 1 ? 0 : 1 )) ; echo $? #=> 1 echo $(( 1, 0 )) #=> 0 (( 1, 0 )) ; echo $? #=> 1 echo $(( 1, 1 )) #=> 1 (( 1, 1 )) ; echo $? #=> 0 echo $(( true )) #=> 0 (( true )) ; echo $? #=> 1 echo $(( false )) #=> 0 (( false )) ; echo $? #=> 1
例 execを使った出力のリダイレクト †
[[ expression ]]
特定の式や文の出力をまとめてリダイレクトしたい場合は、ブレースを使った複合コマンドでも処理できる。
例 複合コマンドの出力をファイルにリダイレクトする
# --- commands --- touch file_ab line="ls file_*" #1 [[ $($line) =~ (.+)_(a)b ]] echo $? echo "${BASH_REMATCH[@]}" #2 [[ "$line" =~ (.+)_(a)b ]] echo $? echo "${BASH_REMATCH[@]}" #3 [[ $(cat <(ls file_*) ) =~ (.+)_(a)b ]] echo $? echo "${BASH_REMATCH[@]}" #4 echo ~ [[ ~ =~ /home/([^/]+) ]] echo $? echo "${BASH_REMATCH[@]}" #5 pattern='/home/([^/]+)' [[ ~ =~ $pattern ]] echo $? echo "${BASH_REMATCH[@]}" #6 - ""すると、#5とは異なるので注意 pattern='/home/([^/]+)' [[ ~ =~ "$pattern" ]] echo $? echo "${BASH_REMATCH[@]}" : [[ '/home/([^/]+)' =~ "$pattern" ]] echo $? echo "${BASH_REMATCH[@]}" #7 pattern='\.' [[ . =~ $pattern ]] [[ . =~ \. ]] echo $? echo "${BASH_REMATCH[@]}" [[ . =~ "$pattern" ]] [[ . =~ '\.' ]] echo $? echo "${BASH_REMATCH[@]}" [[ "\." =~ '\.' ]] echo $? echo "${BASH_REMATCH[@]}" # --- output --- #1 0 file_ab file a #2 1 #3 0 file_ab file a #4 /home/guest 0 /home/guest guest #5 0 /home/guest guest #6 - ""すると、#5とは異なるので注意 1 0 /home/([^/]+) #7 0 . 1 0 \.