以下のように変数から文字列の一部を抽出したいが、間違った置換を返します。
for i in `ls`;do echo ${i|cut -d. -f1};done
-bash: ${i|cut -d. -f1}: bad substitution
私のシナリオでは、ファイルバッチのサフィックスの名前を変更したいと思います。
たとえば、次のようにabc.txt
なります。abc.csv
では、正しい構文で何ができますか?
${i}
ところで、この形式を何と呼ぶのかわかりません。
ベストアンサー1
現在のディレクトリで利用可能な名前の最初のドットの後のすべてのエントリを削除したいようです。
現在のディレクトリのすべての名前を繰り返すには、次のようにします。
for name in *; do ...; done
目視検査以外の目的で出力を使用することはls
エラーが発生しやすいため、避けるべきです。バラより`ls`が解析されないのはなぜですか(代わりに何をすべきですか?)
$name
最初のポイント(ポイント自体を含む)の後のビットを削除するには、${name%%.*}
次のようにします。標準パラメータ拡張.*
変数値からワイルドカードパターンに一致する最も長いサフィックスを削除しますname
。
この拡張の結果を出力するには、次を使用できます。
printf '%s\n' "${name%%.*}"
両方を見るいつ二重引用符が必要ですか?そしてなぜprintfがechoより優れているのですか?。
スクリプト全体は次のように書くことができます。
#!/bin/sh
for name in *; do
printf '%s\n' "${name%%.*}"
done
名前に関する2番目の質問は${i}
変数拡張です(時には「パラメータ拡張」または「変数/パラメータの置換」という用語を使用します)。${i}
変数値に展開/置換しますi
。$i
ここでは、特別な操作を行わずに中括弧で書くこともできます。使用できる唯一の場所は、拡張が${i}
文字$i
列の一部であり、次の文字が変数名に有効な場合です"${i}_stuff"
($i_stuff
変数を拡張しようとしますi_stuff
)。