こんにちは、このコードについて質問があります。
for dir in ~/Documents/CMDsh/*/ # list directories in the form "/tmp/dirname/"
do
countFolder=$((countFolder+1));
#echo $dir; #res: /home/arutosio/Documents/CMDsh/20060 Little Non - Hanamaru Sensation (TV Size)/
dir=${dir%*/};#remove the trailing "/" #res: /home/arutosio/Documents/CMDsh/20060 Little Non - Hanamaru Sensation (TV Size)
nameFolder=${dir##*/}; #print everything after the final "/" #res: 20060 Little Non - Hanamaru Sensation (TV Size)
pathNameFolder="$(echo $nameFolder | sed 's/ /\\ /g')"; #res: 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ (TV\ Size)
pathNameFolder="$(echo $pathNameFolder | sed 's/(/\\(/g')"; #res: 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size)
pathNameFolder="$(echo $pathNameFolder | sed 's/)/\\)/g')"; #res: 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size\)
echo "NumFolder: $countFolder Creating... \"$nameFolder.osz\""; # print everything after the final "/"
echo "zip -r -j -9 ~/osuLazerBeatmap/$pathNameFolder.zip $pathNameFolder/*"; #res: >
#zip -r -j -9 ~/osuLazerBeatmap/20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size\).zip 20060\ Little\ Non\ -\ Hanamaru\ Sensation\ \(TV\ Size\)/*
zip -r -j -9 ~/osuLazerBeatmap/$pathNameFolder.zip $pathNameFolder/*;
echo '------------------------------';
done
しかし、shを実行すると、次の行が表示されます。
zip -r -j -9 ~/osuLazerBeatmap/$pathNameFolder.zip $pathNameFolder/*;
次のエラーが発生します。 zipエラー:無効なコマンド引数(短いオプション「\」はサポートされていません)端末でこの行の結果を実行してみましたが、動作しています。 zip -r -j -9 ~/osuLazerBeatmap/20060\small \non\ -\花丸\センセーション\(TV\サイズ).zip 20060\リトル\ノン\ -\ 花丸\センセーション\(TV\サイズ)/ *
答え1
努力する:
for dir in ~/Documents/CMDsh/*/
do
countFolder=$((countFolder+1))
dir=${dir%*/}
nameFolder=${dir##*/}
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
echo '------------------------------';
done
メモ:
シェル変数への参照は常に二重引用符で囲んでください。この場合、これは次のものを置き換えることを意味します。
zip -r -j -9 ~/osuLazerBeatmap/$nameFolder.zip $dir/*
そして
zip -r -j -9 ~/osuLazerBeatmap/"$nameFolder".zip "$dir"/*
これにより、3行のsedコードを使用してエスケープしようとする必要がなくなります。
このルールの唯一の例外は、明示的に必要な場合です。噴射またはパス名拡張。
例は役に立ちます。 1つのファイルを含むディレクトリの簡単な例を見てみましょう。
$ ls Sensation (TV Size)
シェル変数を作成しましょう。
$ f='Sensation (TV Size)'
それでは、引用符なしでシェル変数を試してみましょう。
$ ls $f ls: cannot access 'Sensation': No such file or directory ls: cannot access '(TV': No such file or directory ls: cannot access 'Size)': No such file or directory
シェル変数を引用すると、これははるかにうまく機能します。
$ ls "$f" Sensation (TV Size)
シェル変数を引用すると、エスケープは必要ありません。
シェルは行の終わりをコマンドの終わりとして扱います。したがって、行末のセミコロンは害を及ぼすことはありませんが、不要です。