シェルスクリプトを書いた中で、困ったこと・詰まったこととその解決方法メモ
最近、学習し始めたシェルスクリプトを書いている時に、困ったこと、詰まったこととその解決方法を書き留める。
< 困ったこと、詰まったこと >
- 代入しても、変数の中身が変わらない。
- sedで1行削除したけど、ファイルの中身が変わっていない。
- 最後の引数が関数に渡っていない。
1. (困ったこと) 変数の中身が変わらない。
<症状等>
csvファイルの中身を1行ずつ読み込んで、条件に合致したらカウントアップしたが、hitcountは0のままだった。
sample.sh
# csvから1行ずつ読み込む
hitcount=0
cat data.csv | while read oneline
do
$product_id=$(echo "${oneline}" | cut -d ',' -f 1)
$product_name=$(echo "${oneline}" | cut -d ',' -f 2)
$product_type=$(echo "${oneline}" | cut -d ',' -f 3)
if [ "$product_type" == "量産品" ]; then
hitcount +=1
fi
done
# ~ 中略 ~
if test $hitcount -ne 0; then # <---$hitcount=0のまま
<解決方法>
cat ファイル名 から < ファイル名へ変更したら、上手く動いた。
sample2.sh
while read oneline
do
# ~ 省略
done < data.csv
2. (困ったこと) sedで1行削除したけど、ファイルの中身が変わっていない。
<症状等>
sedで条件に該当する行を削除したが、ファイルの中身は変わらなかった。
<解決方法>
iオプション(標準出力せずに直接ファイルを上書き)を付ける。
sample2.sh
# 最初に書いたコード
sed '/条件/d' data.csv
# 修正後
sed -i '/条件/d' data.csv
3. (困ったこと) 最後の引数が関数に渡っていない。
<症状等>
最後の引数が渡っていない。
<解決方法>
スペースのある引数が原因。渡すときには""で囲む。
sample3.sh
# 最初に書いたコード
a='AI CHAT'
b='SERVER'
myfunction $a $b
# 修正後
myfunction "${a}" "${b}"
感想、メモ
- 困ったり、詰まったら、まずコマンドのヘルプを読んでみることとする。