Shell
sh - 在 .profile 函式中使用參數
我想在我的 .profile 文件中創建的函式中使用一個參數。
如果沒有給出參數,我想要求輸入,否則將變數設置為 $1。
當我檢查 $1 以查看它是否為空時,我收到以下錯誤:
sh[7]: 1: Parameter not set.
從以下行:
if [ ! -n "$1" ]; then
我使用的是 sh 而不是 bash。
編輯:好的,這是直到 if 語句結束的第一行程式碼:
HOST=`hostname` cd /opt/dirpath ll *.sto if [ x"$1" = x ]; then # Ask for input echo "File: \c"; read outFile else outFile=$1 fi
我正在編輯其他人的程式碼以使用或不使用參數。
我認為還有更多:
要麼這不是你正在使用的命令 - 要麼在函式的其他地方你正在以不同的方式執行它。該錯誤來自
${1?}
. 或者它來自您的測試,但前提是您首先這樣做set -u
。要解決這個問題,請停止這樣做。做
set +u; fn_name
,看看會發生什麼。如果你${1?}
在那裡有任何擴展,那麼在你給函式一個參數之前,這個錯誤不會消失。以下是一些如何重現該錯誤的程式碼範例:
sh -c 'fn(){ [ ! -n "${1?}" ]; }; fn' sh: 1: 1: parameter not set
…或者…
sh -uc 'fn(){ [ ! -n "$1" ]; }; fn' sh: 1: 1: parameter not set
…但…
sh -uc 'fn(){ [ ! -n "$1" ]; } set +u; fn; echo "$?"' 0
…和…
sh -c 'fn(){ [ ! -n "${1?}" ]; } fn some args; echo "$?"' 1
如果該功能正在設置,
-u
那麼您可能應該將其編輯出來。否則,如果您.profile
這樣做,也是如此。在大多數情況下,set -u
這不是一個理想的持久性 shell 設置,這是因為該模式旨在殺死 shell。它沒有提供任何簡單的方法來處理它生成的各種錯誤——這就是你試圖用[
test做的事情]
。