Shell使用
使用 $1
和備份預設值的別名列印參數和備份值
我想創建一個可以處理參數 (
$1
) 的別名,如果未提供參數,可以回退到預設值。例如,$ alias foo='NUM=${1:-42}; echo $NUM'
在沒有參數的情況下呼叫它可以按我的意願工作:
$ foo 42
但是使用參數呼叫,它會列印我的值和預設值:
$ foo 69 42 69
我不明白為什麼會這樣。應該如何正確完成?我怎樣才能自己調試這種問題?
別名只是在另一輪 shell 語法解釋之前的文本替換,它們不帶參數,所以在之後:
foo 69
foo
文本被替換為,然後NUM=${1:-42}; echo $NUM
shell 解釋生成的文本:NUM=${1:-42}; echo $NUM 69
$1
仍然沒有設置,所以這是NUM=42; echo 42 69
對於在目前 shell 中解釋並接受參數的內聯腳本,請改用函式:
foo() { NUM=${1-42} printf '%s\n' "$NUM" }
在這裡使用
${1-42}
而不是${1:-42}
,就像使用者呼叫一樣foo ''
,我會假設他們希望$NUM
被分配空字元串。