変数の内容であるコマンドを実装します。
指定されたディレクトリ内のすべてのファイルの名前を変更できるbashの名前変更プログラムを作成しようとしています。次のプログラムがあります。
for PATHFILE in tracks/*
do
path="$(dirname "$PATHFILE")"
file="$(basename "$PATHFILE")"
program='mv';
if [[ "$file" =~ ([0-9]*)\s*(.*) ]]
then
from=${path}/${file}
to=${path}/${BASH_REMATCH[1]};
command_string="$program '$from' '$to'";
#here the command_string contains the command i want to execute.
$(command_string);
#causes error:
# mv: target ''\''tracks/01'\''' is not a directory.
break;
fi
done
直接コマンドを実行すると問題なく実行されます。また、システムが文字列の周りにこれらのコンマを追加する理由もわかりません。
変数を画面に表示すると、変数をコピーして実行でき、エラーなしで実行されます。しかし、コードで実行しようとすると、このエラーが発生し続けます。
どのように機能させますか?
答え1
まず、$(command_string)
「bash:command_string:command notfound」エラーがコマンドの代替として提供されます。コマンド置換は、括弧で囲まれたコマンドを実行し、内容全体をそのコマンドの出力に置き換えます。
次に、コマンドの実行にのみ使用しても、$command_string
ファイル名に一重引用符を追加できます。ファイル名に一重引用符はありません。
通常、コマンドを変数に入れないでください。望むより」変数に保存されたコマンドをどのように実行できますか?」。
代わりに、次のようになります。
#!/bin/bash
for pathname in tracks/*; do
if [[ "$pathname" =~ ([0-9]+)[[:blank:]]* ]]; then
newpathname="${pathname%/*}/${BASH_REMATCH[1]}"
printf 'Would move "%s" to "%s"\n' "$pathname" "$newpathname"
# mv -i "$pathname" "$newpathname"
break
fi
done
このループはあなたが望むことを行います。安全のため、実際にファイル名を変更する部分をコメントアウトしました。