如何在Bash中将用户输入读入变量?

207

在Bash中,如何将用户输入读入一个变量?

fullname=""
# Now, read user input into the variable `fullname`.

参见在bash中读取带有默认值的变量 - 简而言之:read -e -p "一些提示:" -i "默认值" some_var; echo "$some_var" - undefined
6个回答

371
使用read -p

# fullname="USER INPUT"
read -p "Enter fullname: " fullname
# user="USER INPUT"
read -p "Enter user: " user

如果你想获取用户的确认:
read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1

你还应该引用变量,以防止路径名扩展和空格分隔:

# passwd "$user"
# mkdir "$home"
# chown "$user:$group" "$home"

9
您可以使用${confirm^^} == 'YES'。 该语句的意思是检查${confirm}变量中的文本是否全为大写字母的"YES",如果是则返回true,否则返回false。 - Aleks-Daniel Jakimenko-A.
2
@Aleks-DanielJakimenko 这是其他人使用的常规方法,但只兼容4.0+。 - konsolebox
你能演示一下如何将“继续?(Y/N)”这行代码写成多行以提高可读性吗?我正在尝试这样做,但似乎不起作用:if [[ "$confirm" == [yY] ]]; do... - Gabriel Staples
我应该使用 then 而不是 do: if [[ "$confirm" == [yY] || "$confirm" == [yY][eE][sS] ]]; then... 无论如何,如果您将这个多行版本添加到您的答案中,那将会很有帮助。 - Gabriel Staples
我使用了 read -p "这个可以吗?(y/n)" confirm && if [[ ! "$confirm" =~ ^[Yy]+([eE][sS])?$ ]]; then echo "不是yes"; fi 这段代码可以匹配 yyyyyyyyyyyyyyes,但不能匹配 yessssssyeeeesyepN 等。 - NotoriousPyro
显示剩余2条评论

19

18

试一下这个

#/bin/bash

read -p "Enter a word: " word
echo "You entered $word"

9

最大程度的可移植性(bash,zsh,...):

printf "%s" "Enter fullname: "
read fullname

这是最便携的用提示符读取输入的方式。像read -pecho -n这样的方法更有可能因为使用的shell不同而失败。


5
您也可以尝试使用 zenity
user=$(zenity --entry --text 'Please enter the username:') || exit 1

4

https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html

从标准输入读取一行,或从作为 -u 选项参数提供的文件描述符 fd 中读取,按照单词拆分中所述的方式拆分成单词,并将第一个单词分配给第一个名称,第二个单词分配给第二个名称,以此类推。如果有多余的单词,则将剩余的单词及其间隔符分配给最后一个名称。

echo "bash is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")

bash将是var1
is awesome将是var2
echo -e启用ubuntu手册中的反斜杠转义解释。


因此完整的代码可以是:
echo -n "Enter Fullname: "
read fullname
echo "your full name is $fullname."
echo -n "test type more than 2 word: "
read var1 var2; echo -e
read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接