Q1シェル変数への代入で正しい書き方はどれですか?
変数とコマンド置換 — $(...) で結果を受け取る
この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
name=valueの代入と "$name" 参照、シングルとダブルクォートの展開差、$(date)のコマンド置換、$(( n * 2 ))の算術、readでの入力受け取りまでを、図解と端末で実習します。
変数を使う — 代入・参照
シェルスクリプトでは、値に名前を付けて何度でも使い回せます。
代入はname=valueの形で書き、=の前後に空白を入れてはいけません。
空白を入れると別のコマンドとして解釈されてエラーになります。
代入した値は$nameまたは${name}で取り出します。
$nameの直後に文字を続けると変数名の一部と解釈されるため、${name}で境界を区切ります。
name=aliceで値を入れ、$nameで取り出して使います。クォート — シングルとダブルの展開差
文字列を囲む引用符には2種類あり、展開のされ方が違います。
シングルクォート'...'の中は$nameも文字どおりに扱われ展開されません。
ダブルクォート"..."の中は$nameが値に置き換わります。
"Hello $name"のように文章の途中に値を入れたいときはダブルクォートを使い、$をそのまま表示したいときはシングルクォートを使います。
$nameをそのまま、ダブルクォートは値に置き換えて表示します。name=alice # = の前後に空白を入れない
echo "hello $name" # hello alice(ダブルは展開する)
echo 'hello $name' # hello $name(シングルは展開しない)
echo "path is ${name}/data" # 名前の境界を {} で明示できる
コマンド置換 — $()
$(command)は、コマンドの出力結果をその場の値として使う書き方です。
today=$(date +%Y-%m-%d)のように書くと、dateが出した日付がそのままtodayに入ります。
コマンドで得た結果を変数に取り込んだり、文章の中に差し込んだりするときに使います。
$(date)はdateを実行した出力に置き換わり、today=$(date)でその値が変数に入ります。today=$(date +%Y-%m-%d) # date の出力を変数に取り込む
echo "today is $today" # 取り込んだ値を文章に埋め込む
user=$(whoami) # 別のコマンドの出力も値にできる
echo "user: $user"
算術展開 — $(( ))
$(( ))の中は整数の算術計算です。
$(( 3 + 4 ))は7に置き換わります。
足し算は+、引き算は-、掛け算は*、割り算は/、余りは%が使えます。
変数は$を付けず、$(( n * 2 ))のようにそのまま名前で書けます。
$(( ))の中の式が計算され、$(( 3 + 4 ))は7、n=5なら$(( n * 2 ))は10になります。echo "sum: $(( 10 + 5 ))" # 足し算は 15
n=7
echo "double: $(( n * 2 ))" # 変数は $ なしで書ける
echo "rest: $(( 17 % 5 ))" # 余りは % で 2
入力を受け取る — read
read vは入力を1行読み取り、変数vに入れます。
スクリプトの中で利用者に値を尋ねたいときに使います。
本講座のコンソールでは、printf 'value\n' | ./greet.shのように入力をパイプで渡すと安定して動かせます。
readの前にechoで問いかけを出すと、何を入力すればよいかが分かりやすくなります。
read nは1行を読み取ってnに入れます。printfで値をパイプで渡すと、手で打たずにreadへ届きます。echo "enter your name:" # 何を入力するか問いかける
read who # 1行を読み取り who に入れる
echo "hi, $who" # 受け取った値を文章に埋め込む
printf 'bob\n' | (read who; echo "hi, $who") # 入力はパイプでも渡せる
コマンド置換で件数をメッセージに埋め込む
コマンド置換$()は、ファイル数のような「数えた結果」を変数に取り込むときによく使います。
n=$(ls *.txt | wc -l)のように書くと、lsとwc -lの連携結果がnに入ります。
その変数をダブルクォートの文章に埋め込むと、件数を含む読みやすい1行メッセージを組み立てられます。
lsとwc -lで数えた件数がコマンド置換でnに入り、文章に埋め込むとtxt files: 2と表示されます。理解度チェック
まずは1問ずつ答えてみましょう。
Q2echo '$name'はどう表示されますか(name=aliceのとき)?
Q3コマンドの出力を値として変数に入れる書き方はどれですか?