我嘗試創建一個 var 來在 k8s 中進行一些操作。我故意在 '=' 和 export 和我想要快捷方式的 cmd 之間放置空格。為什么linux shell給我錯誤?
export do = '--dry-run=client -o yaml'
-bash: export: `=': not a valid identifier
-bash: export: `--dry-run=client -o yaml': not a valid identifier
uj5u.com熱心網友回復:
shell中的基本操作是運行命令。您可以通過說明命令的名稱,后跟可選的以空格分隔的引數串列來執行此操作。其他所有語法都由此而來。
export do = '--dry-run=client -o yaml'只是對export帶有 3 個單獨引數的命令的呼叫。沒有任務。
賦值是包含出現在適當背景關系中的單個單詞的單個單詞。=在export命令的情況下,它的每個引數是:
- 一個有效的識別符號,在該識別符號上設定了匯出屬性
- 形式為 的有效賦值
name=value,在這種情況下name接收匯出屬性并將值value分配給名稱。
正如評論中提到的,最好使用陣列來存盤引數串列。(請注意,您不能匯出array,也可能不需要匯出僅在 shell 中使用的名稱,而不是在子行程的環境中查找的名稱。)
do=(--dry-run=client -o yaml)
some_command "${do[@]}" # instead of some_command $do
uj5u.com熱心網友回復:
這不起作用的原因與 bash 的向后兼容有關。您在 CLI 上使用的語法與您在 shell 腳本上使用的語法相同;shell 腳本將始終采用每行的第一個單詞并將它們解釋為命令。
命令名稱后由空格分隔的所有內容都將被解釋為以空格分隔的引數串列。讓我們看一下匯出的更簡單版本,因為它本質上是將定義的變數設定為環境變數:
# This will evaluate to the command 'do' being executed with '='
# and '--dry-run=client -o yaml' being evaluated as arguments
do = '--dry-run=client -o yaml'
為了避免這種情況,Bash 需要在沒有空格的情況下進行變數分配。這樣 bash 可以在您的命令中查找任何等號并將它們解釋為賦值。
# Assigns the string '--dry-run=client -o ymal' to the variable 'do'
do='--dry-run=client -o yaml'
由于 export 只是接受變數賦值并將其轉換為全域環境變數,因此您需要遵循相同的約定:
export do='--dry-run=client -o yaml'
uj5u.com熱心網友回復:
匯出就像每個 Unix 程式一樣作業:
program agr1 arg2
args 通過空格分隔,因此在您的情況下,args 是:
arg1: "do"
arg2: "="
arg3: "'--dry-run=client -o yaml'"
export不能處理這個,因為它沒有意義。
但如果你試試這個:
export a='echo a' b='echo b'
引數將是:
arg1: "a='echo a'"
arg2: "b='echo b'"
并且export知道這種語法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/412227.html
標籤:
