2017-06-21 68 views
0

首先,你可以用linux shell做這些轉換的名字是什麼?如何在shell腳本變量中使用{old,new}名稱?

$ 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" 

而且,我很難放在一起shell變量和name補充即$varname。我想出圍繞$var名稱使用單引號,即'$var'name。想過,這是做這件事的最好方法嗎?

+1

是字符串分割和通配符* *後參數替代這種情況發生的唯一的擴展。在展開*值之前,Brace展開發生。有很多令人信服的安全原因,爲什麼這是真的(如果任意數據被解析爲語法,你基本上可以*不會*在bash中編寫腳本來處理帶有不可信名稱的文件)。 –

+0

...所以,簡短的回答是「你不能這樣做*出於好的原因*,並且試圖找到解決方法(與'eval'一樣)將危害安全性,除非非常小心」。 –

回答

1

當您不需要時,您不想評估變量的內容。 其中一種選擇是寫一個函數。

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

當名稱是動態的,你可以改變你的函數

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" 

編輯: 因爲我遷移到Linux和猛砸我忽略POSIX。作爲@Charles評論,更便於攜帶是

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

謝謝!你用一個漂亮的代碼來解決我的問題。 – user

+0

爲什麼在這裏使用非POSIX函數聲明語法?這個方法是一個很好的方法,但是用於實現它的代碼與'/ bin/sh'有些不必要的兼容。 –

+0

@CharlesDuffy我在''ksh''的Solaris和AIX環境中長時間''''''使用''函數。我推薦使用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中編寫處理不可信數據的腳本是不可能的。


坦率地說,你的示例代碼,它是更短的只是它正是如此寫:

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取代胸罩ce擴展(手寫的,可信的代碼)和%q來代替(推測不可信)的文件名。

+0

感謝所有的解釋和時間! – user

相關問題