我需要在bash腳本中從終端讀取一個值。我希望能夠提供用戶可以更改的默認值。在bash中讀取一個默認值的變量
# Please enter your name: Ricardo^
在此腳本中,提示是「請輸入您的姓名:」默認值爲「Ricardo」,光標位於默認值之後。有沒有辦法在bash腳本中做到這一點?
我需要在bash腳本中從終端讀取一個值。我希望能夠提供用戶可以更改的默認值。在bash中讀取一個默認值的變量
# Please enter your name: Ricardo^
在此腳本中,提示是「請輸入您的姓名:」默認值爲「Ricardo」,光標位於默認值之後。有沒有辦法在bash腳本中做到這一點?
可以使用parameter expansion如
read -p "Enter: " name
name=${name:-Richard}
echo $name
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname
設置默認值;打印它;讀一個新的價值;如果有新值,則用它代替默認值。在shell和系統之間存在(或者是)一些關於如何在提示結束時禁止換行符的變體。 '\ c'符號似乎可以在MacOS X 10.6.3上使用3.x bash,並且適用於從System V派生的大多數Unix變體,使用Bourne或Korn shell。
另請注意,用戶可能不會意識到幕後發生了什麼;他們的新數據將在屏幕上的名稱後輸入。這可能是更好的對其進行格式化:
echo "Please enter your name ($name): \c"
'printf'比'更便攜echo' – ghostdog74 2010-04-15 03:54:50
@ ghostdog74:也許是這樣;我們這些在25年前學習shell編程的人很難確定我們的哪些做法仍然相關。它越來越像bash改寫了一切。我知道printf作爲命令已經有一段時間了 - 我很少使用它,儘管(可能 - 從來沒有?)。我得到的印象我應該閉嘴殼直到我(重新)學習bash。 「這很有趣;我工作的軟件有一些不太好的shell腳本 - 但麻煩不是bash-isms。我只是厭倦了修復'if(test -z「$ xxx」); ......「和其他C shellism。 – 2010-04-15 07:20:40
在bash 4:
name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"
這這樣的提示後,顯示的名稱:
Please enter your name: Ricardo
與遊標在名稱的末尾,並允許用戶編輯它。最後一行是可選的,如果用戶刪除了輸入或默認值(提交null),強制名稱爲原始默認值。
read -e -p "Enter Your Name:" -i "Ricardo" NAME
echo $NAME
很好的答案!我只想提一提,我遇到了麻煩,因爲我沒有看到「裏卡多」和NAME之間的空間,但是一旦我發現了...... *魔法*!謝謝! – 2012-06-17 00:05:05
不幸的是,我不是OSX的有效選項10.7 – undefined 2013-01-22 17:37:32
@BrianMortenson您可以使用自制軟件升級bash:http://stackoverflow.com/questions/16416195/how-do-i-upgrade-bash-in-mac-osx -mountain-lion-and-set-it-the-correct-path – antonagestam 2014-04-01 22:13:04
代碼:
IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"
OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"
echo "Input: $IN_PATH Output: $OUT_PATH"
採樣運行:
Please enter IN_PATH [/tmp/input.txt]:
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt
我喜歡這個,因爲它遵循我在很多shell腳本中看到的約定,默認值在冒號前的方括號中。謝謝!!! – morphatic 2017-08-04 18:35:23
-e和-t參數不能一起工作。我嘗試了一些表情,結果是下面的代碼片段:
QMESSAGE="SHOULD I DO YES OR NO"
YMESSAGE="I DO"
NMESSAGE="I DO NOT"
FMESSAGE="PLEASE ENTER Y or N"
COUNTDOWN=2
DEFAULTVALUE=n
#----------------------------------------------------------------#
function REQUEST()
{
read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
INPUT=${INPUT:-$DEFAULTVALUE}
if [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
echo -e "\n$YMESSAGE\n"
#COMMANDEXECUTION
elif [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
echo -e "\n$NMESSAGE\n"
#COMMANDEXECUTION
else
echo -e "\n$FMESSAGE\n"
REQUEST
fi
}
REQUEST
你的答案與這個問題沒有太大關係,是嗎?... – 2014-11-08 20:16:49
它的工作是使用-e和-t參數。 此代碼行(-e和-i默認值): 讀-e -p 「輸入你的名字:」 -i 「裏卡多」 NAME 不以countdowntimer(-t)工作 – speefak 2014-11-08 20:31:35
呀但這是在問題中沒有問,是嗎? – 2014-11-08 20:36:13
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1/1024/1024 ; print foo "MB" }'
請將解釋添加到您的答案。 – 2015-01-13 12:44:10
我發現這個問題,尋找一種方式來呈現類似:
Something interesting happened. Proceed [Y/n/q]:
使用上面的例子,我推斷這個: -
echo -n "Something interesting happened. "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
echo "Quitting"
exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
echo "Not Proceeding"
else
echo "Proceeding"
# do proceeding code in here
fi
希望幫助別人不必想出邏輯,如果他們遇到同樣的問題
我只是用這個模式,這是我比較喜歡:
read name || name='(nobody)'
我最終做了一些基於此。讀入一個臨時變量'input',然後使用'name = $ {input: - $ name}'。 – rmarimon 2010-04-15 05:05:15
這實際上並沒有回答這個問題。應在提示中顯示默認值。 – 2011-10-26 00:47:21
和'name = $ {!input: - $ name}'會做什麼? – 2015-03-17 10:27:49