シェルスクリプトの名前変更

シェルスクリプトの名前変更

変数の内容であるコマンドを実装します。

指定されたディレクトリ内のすべてのファイルの名前を変更できる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

このループはあなたが望むことを行います。安全のため、実際にファイル名を変更する部分をコメントアウトしました。

関連情報