2017-06-21 8 views
0

まず、Linuxシェルでできるこれらの変換の名前は何ですか?シェルスクリプト変数内で{old、new} nameを使用するにはどうすればいいですか?

$ echo {old,new}name 
oldname newname 

私が通り、変数に続い入れてみました:

$ var={old,new}name 
$ echo $var 
{old,new}name 

しかし、私たちが見ることができるよう、彼らには、作業を停止。だから私はそれを書くことができるよう

mv {old,new}name/"file 1.txt" 
mv {old,new}name/"file 2.txt" 
mv {old,new}name/"file 3.txt" 
mv {old,new}name/"file 4.txt" 

:また

var={old,new} 

mv '$var'name/"file 1.txt" 
mv '$var'name/"file 2.txt" 
mv '$var'name/"file 3.txt" 
mv '$var'name/"file 4.txt" 

、私はトラブルがシェル変数とnameを一緒に入れていた私は簡単に許すとして一括操作でそれらを変更するには、変数にそれらを必要すなわち、$varnameを補完する。 $varという名前(つまり、'$var'name)を一重引用符で囲むことにしました。思考、それをするのが最善の方法ですか?

+1

です。パラメータ置換後の唯一の拡張は、文字列分割とグローブです。 *値が展開される前にブレース拡張が行われます。妥当なセキュリティ関連の理由がこれに当てはまります(任意のデータが構文解析された場合、信頼できない名前のファイルを処理するbashでスクリプトを書くことはできません)。 –

+0

...だから、短い答えは "あなたは*良い理由でそれをすることはできません*、回避策を見つけようとすると(' eval'のように)、細心の注意を払わなければセキュリティを脅かすでしょう。 –

答えて

1

必要がない場合は、variabeleの内容を評価したくありません。 代替手段の1つが関数の書き込みです。私はLinuxとバッシュI怠慢POSIXに移行するので :名前が動的である場合は、あなたが

function oldnew { mv old"$1"/"$2" new"$1"/"$2" } 
oldnew name "file 1.txt" 
oldnew name "file 2.txt" 
oldnew name "file 3.txt" 
oldnew name "file 4.txt" 

EDITをあなたの機能を変更することができます

function oldnewname { mv oldname/"$1" newname/"$1" } 
oldnewname "file 1.txt" 
oldnewname "file 2.txt" 
oldnewname "file 3.txt" 
oldnewname "file 4.txt" 

。 @Charlesがコメントしたように、より移植性の高いものは

oldnewname() 
{ 
    mv oldname/"$1" newname/"$1" 
} 
+0

ありがとう!あなたは、見栄えの良いコードで私の問題を解決する答えをします。 – user

+0

なぜPOSIX以外の関数宣言構文を使用するのですか?このアプローチは良い方法ですが、それを実装するために使用されるコードは '/ bin/sh'といくらか互換性がありません。 –

+0

@CharlesDuffy私は、 'ksh'を使ってSolaris環境とAIX環境で' function'a長い時間を使いました。私は、https://unix.stackexchange.com/a/73854/57293のようなものを使って自分のスタイルを再考しました。 –

3

あなたは配列内の拡張に結果を保存することができます

var=({old,new}name)  # performs expansion, stores results in var 
printf '%s\n' "${var[@]}" # prints "oldname" and "newname" 

しかし、ブレース展開が行われているパラメータ展開の後に(つまり、変数の値の代入)。これは説得力のある理由です:データがコードとして解析された場合、信頼できないデータを扱うスクリプトをbashで書くことは不可能です。


率直に言って、あなたのサンプルコードのために、それだけでthuslyそれを書くために短いです:

for name in name/"file "{1,2,3,4}.txt; do 
    mv -- old"$name" new"$name" 
done 

あなたは危険、安全でない-なし - 極端な注意をしたい場合は、言いました事、その注意へのアプローチは、このように見えるかもしれません:

var='{old,new}' 
for f in "file 1.txt" "file 2.txt" "file 3.txt" "file 4.txt"; do 
    printf -v cmd 'mv %sname/%q' "$var" "$name" && eval "$cmd" 
done 

をここでは、我々はブラジャーを置換する%sを使用しています(手動で書かれた、信頼できるコード)、そして%q(おそらく信頼できない)ファイル名で置き換えてください。

+0

すべての説明と時間をいただきありがとうございます! – user

関連する問題