1、read命令
read
是一个在Unix/Linux shell中用于从用户输入读取数据的命令。它允许您在脚本中接收用户的键盘输入,并将输入存储到变量中,以便后续处理。以下是一些 read
命令的示例用法:
-
读取用户输入:
echo "What's your name?" read name echo "Hello, $name!"
在这个例子中,
read name
会等待用户输入,并将输入存储到名为name
的变量中。然后,脚本会输出欢迎消息,包括用户输入的名字。 -
读取多个值:
echo "Enter your age and city:" read age city echo "You are $age years old and live in $city."
在这个例子中,
read age city
会等待用户输入两个值,分别存储到age
和city
变量中。 -
设置提示符:
read -p "Enter a number: " number echo "You entered: $number"
使用
-p
选项可以设置一个提示符,让用户知道他们需要输入什么类型的数据。 -
隐藏输入:
read -s -p "Enter your password: " password echo "Password entered."
使用
-s
选项可以隐藏用户的输入,适用于输入密码等敏感信息。 -
超时处理:
read -t 5 -p "Enter something (5 seconds timeout): " input if [ -z "$input" ]; then #-z "$input" 表示检查变量 $input 是否为空,如果为空则返回真(即条件成立),否则返回假(条件不成立)。 echo "Timeout!" else echo "You entered: $input" fi
使用 -t
选项可以设置超时时间,如果用户在指定时间内没有输入,脚本会做相应处理。
6.读取的输入分割成数组
input="apple banana cherry"
IFS=" " read -ra fruits <<< "$input"
read
命令通常用于与用户进行交互,接收输入并执行相应的操作。它是编写交互式脚本的重要工具。
2、if 流程控制语句
在Unix/Linux shell中,if
是一种流程控制语句,用于根据条件执行不同的代码块。以下是 if
语句的一般语法:
if [ condition ]; then
# Code to be executed if the condition is true
fi
if [ condition ]; then
# Code to be executed if the condition is true
else
# Code to be executed if the condition is false
fi
if [ condition ]; then
# Code to be executed if the condition is true
elif
# Code to be executed if the condition is true
else
# Code to be executed if the condition is false
fi
其中,关键要点如下:
-
if
后面紧跟一个条件测试,通常使用方括号[ ... ]
或test
命令来执行条件判断。条件的结果要么为真(非零),要么为假(零)。 -
then
关键字标志着条件成立时要执行的代码块的开始。 -
else
关键字标志着条件不成立时要执行的代码块的开始。 -
fi
表示if
语句的结束。
以下是一个使用 if
语句的示例:
#!/bin/bash
read -p "Enter a number: " number
if [ "$number" -gt 10 ]; then
echo "The number is greater than 10."
else
echo "The number is not greater than 10."
fi
在这个示例中,用户输入一个数字,然后根据输入的数字大小执行不同的代码块。
此外,还可以使用 elif
关键字来添加更多的条件分支,构建更复杂的条件逻辑:
#!/bin/bash
read -p "Enter a number: " number
if [ "$number" -gt 10 ]; then
echo "The number is greater than 10."
elif [ "$number" -eq 10 ]; then
echo "The number is equal to 10."
else
echo "The number is less than 10."
fi
这允许您根据不同的情况执行不同的代码块。总之,if
语句是在shell脚本中实现条件控制流的重要工具。
3、test命令
test
命令通常用于条件测试,它判断给定的条件是否成立,并根据条件的真假返回相应的退出码。在许多 Unix-like 操作系统中,test
命令也可以使用方括号 [ ]
来表示,因为方括号实际上是 test
命令的一个别名。
以下是一些常用的 test
命令和参数:
-
数值比较:
-
-eq
:等于(equal) -
-ne
:不等于(not equal) -
-gt
:大于(greater than) -
-lt
:小于(less than) -
-ge
:大于等于(greater than or equal to) -
-le
:小于等于(less than or equal to)
-
-
字符串比较:
-
=
:等于(equal) -
!=
:不等于(not equal) -
-z
:长度为零(空字符串) -
-n
:长度非零(非空字符串)
-
-
文件检查:
-
-e
:文件或目录存在(存在) -
-f
:普通文件存在(存在且是普通文件) -
-d
:目录存在(存在且是目录) -
-r
:可读(有读取权限) -
-w
:可写(有写入权限) -
-x
:可执行(有执行权限) -
-b
:块文件(存在) -
-c
:字符型特殊文件(存在)
-
-
逻辑操作:
-
!
:逻辑非(取反) -
-a
:逻辑与(and) -
-o
:逻辑或(or)
比较选项 描述 示例 -eq
相等(整数比较) if [ "$a" -eq "$b" ]
-ne
不相等(整数比较) if [ "$a" -ne "$b" ]
-gt
大于(整数比较) if [ "$a" -gt "$b" ]
-lt
小于(整数比较) if [ "$a" -lt "$b" ]
-ge
大于等于(整数比较) if [ "$a" -ge "$b" ]
-le
小于等于(整数比较) if [ "$a" -le "$b" ]
=
字符串相等比较 if [ "$str1" = "$str2" ]
!=
字符串不相等比较 if [ "$str1" != "$str2" ]
-z
字符串为空(长度为0)比较 if [ -z "$str" ]
-n
字符串非空(长度大于0)比较 if [ -n "$str" ]
-e
文件存在比较 if [ -e "$file" ]
-f
文件为常规文件比较 if [ -f "$file" ]
-d
文件为目录比较 if [ -d "$dir" ]
-r
文件可读比较 if [ -r "$file" ]
-w
文件可写比较 if [ -w "$file" ]
-x
文件可执行比较 if [ -x "$file" ]
-
下面是一些示例用法:
# 数值比较
if [ $num -eq 10 ]; then
echo "num 等于 10"
fi
# 字符串比较
if [ "$str" = "hello" ]; then
echo "str 等于 hello"
fi
# 文件检查
if [ -e /path/to/file ]; then
echo "文件存在"
fi
# 逻辑操作
if [ $num -lt 5 -o "$str" = "world" ]; then
echo "num 小于 5 或者 str 等于 world"
fi
这只是 test
命令的一些常见用法示例。你可以在终端中输入 man test
或者 help test
以获取更详细的文档和用法说明。
例:判断用户在系统中是否存在,是否有家目录
#!/bin/bash
read -p "input your name: " NAME
if grep "$NAME" /etc/passwd; then
# grep 命令中,如果用户输入的 $NAME 包含特殊字符,可能会导致 grep 命令解释问题。为了避免这个问题,应该将变量 $NAME 放在双引号中,以确保输入的字符串被正确解释。
echo "The user $NAME exists on this system."
elif [ -d "/home/$NAME" ]; then #[ -d "/home/$NAME" ] 实际上是在调用一个名为 test 的命令,其中 -d 是一个参数,用于检查目录是否存在。
echo "The user $NAME does not exist on this system."
echo "The user $NAME has a home directory."
else
echo "The user $NAME does not exist on this system."
echo "The user $NAME does not have a home directory."
fi
例:数字比较大小
1 #!/bin/bash
2 if [ $1 -eq $2 ];then
3 echo "it's ok"
4 else
5 echo "it's error"
6 fi
例:字符比较大小
1 #!/bin/bash
2 VAR1=test
3 VAR2=Test
4 if [ $VAR1 \> $VAR2 ];then
5 echo "$VAR1 > $VAR2"
6 else
7 echo "$VAR1 < $VAR2"
8 fi
例:清空日志
1 #!/bin/bash
2 # clear /var/log/messages
3 # 确定当前是root用户
4 if [ $USER != "root" ];then
5 echo "你必须使用root用户才能执行脚本"
6 exit 10
7 fi
8
9 # 判断文件是否存在
10 if [ ! -f /var/log/messages ];then
11 echo "文件不存在"
12 exit 12
13 fi
14
15 # 保留最近100行日志
16 tail -100 /var/log/messages > /var/log/mesg.tmp
17
18 # 日志清理
19 > /var/log/messages
20 mv /var/log/mesg.tmp /var/log/messages
21 echo "logs clean up"
[[]]
和 []
区别
[[]]
和 []
都是用于条件测试的语法,但它们之间有一些区别。它们分别是 Bash 中的不同条件判断语法。以下是它们的区别:
-
[ ](方括号):方括号是传统的条件测试语法,在 Bash 中也称为
test
命令的等效写法。方括号内的条件表达式用于测试条件是否为真,并返回退出码来表示测试的结果。需要注意的是,方括号内的条件表达式和运算符之间需要有空格来分隔。例如:if [ "$var" -eq 10 ]; then echo "var is equal to 10" fi
这里,
-eq
是数值相等的比较运算符。 -
[[ ]](双方括号):双方括号是 Bash 的扩展条件测试语法。它提供了更丰富的条件判断功能,支持更多的逻辑和字符串操作,还可以省略变量的引号。在双方括号中,不需要在运算符两侧使用空格。例如:
if [[ $var -eq 10 ]]; then echo "var is equal to 10" fi
注意,双方括号内的变量不需要引号。而且,双方括号支持更多的逻辑操作,如
&&
和||
。
相比之下,[[ ]]
的语法更加强大和灵活,通常在 Bash 脚本中更常用,特别是当需要进行复杂的条件判断时。但需要注意的是,[[ ]]
是 Bash 的扩展语法,可能不在所有的 POSIX 兼容的 shell 中都受支持。在 CentOS 8 中,默认情况下,Bash 是默认的 shell,因此 [[ ]]
是可用的。
通配符
通配符 | 说明 | 示例 |
---|---|---|
* |
匹配零个或多个字符 | *.txt 匹配所有 .txt 文件 |
? |
匹配一个字符 | file?.txt 匹配 file1.txt 等 |
[] |
匹配指定字符集中的任意一个字符 | [abc] 匹配 a 、b 或 c |
[!...] 或 [^...] |
匹配不在指定字符集中的任意字符 | [^0-9] 匹配任何非数字字符 |
{} |
创建字符串的组合,逗号分隔 | {file1,file2}.txt 匹配两个文件 |
\ |
用于转义通配符字符,使其作为普通字符 | \* 匹配实际的 * 字符 |
例:/etc
目录的备份
1 #!/bin/bash
2 baknamefile=$(date +%F)
3 bakdir=/root/etcbak
4 srcdir=/etc
5 [ -e $bakdir ] ||mkdir $bakdir
6 tar -zcf $bakdir/$baknamefile-etc.tar.gz $srcdir
7 echo "====================="
8 ls -lh $bakdir/$baknamefile-etc.tar.gz
9 echo "backup is ok "
&&
和||
在Unix/Linux shell中,&&
和 ||
是逻辑操作符,用于执行命令的条件组合。它们被用于控制命令的执行流程,允许根据前一个命令的成功或失败状态来决定是否执行下一个命令。以下是它们的用法:
-
逻辑与
&&
:-
command1 && command2
: 如果command1
执行成功(返回退出码为0),则执行command2
。
示例:
、mkdir myfolder && cd myfolder
这将首先创建名为
myfolder
的文件夹,如果成功创建,则切换到该文件夹。 -
-
逻辑或
||
:-
command1 || command2
: 如果command1
执行失败(返回退出码非零),则执行command2
。
示例:
rm non_existent_file || echo "File does not exist."
这将尝试删除一个不存在的文件,如果删除失败,则输出 "File does not exist."。
-
这些逻辑操作符可以用于构建更复杂的命令组合。例如,您可以在脚本中使用它们来处理错误情况,避免执行不必要的操作,以及根据条件选择性地执行命令。
请注意,&&
和 ||
都是短路操作符,这意味着如果前一个命令的结果已经能够决定最终结果,后续的命令将不会被执行。
4、实战shell脚本
例:查看服务状态
1 #!/bin/bash
2 if [ $# -ge 1 ]; then
3 systemctl status $1 > /dev/null
4 if [ $? == 0 ]; then
5 echo "$1 服务正在运行"
6 else
7 systemctl start $1
8 if [ $? == 0 ]; then
9 echo "$1 服务已成功启动"
10 else
11 echo "无法启动 $1 服务"
12 fi
13 fi
14 else
15 echo "执行脚本的格式"
16 echo "sh $0 服务名"
17 fi
例:日志清理
1 #!/bin/bash
2 # clear /var/log/messages
3 # 确定当前是root用户
4 if [ $USER != "root" ];then
5 echo "你必须使用root用户才能执行脚本"
6 exit 10
7 fi
8
9 # 判断文件是否存在
10 if [ ! -f /var/log/messages ];then
11 echo "文件不存在"
12 exit 12
13 fi
14
15 # 保留最近100行日志
16 tail -100 /var/log/messages > /var/log/mesg.tmp
17
18 # 日志清理
19 > /var/log/messages
20 mv /var/log/mesg.tmp /var/log/messages
21 echo "logs clean up"
例:etc
备份
1 #!/bin/bash
2 baknamefile=$(date +%F)
3 bakdir=/root/etcbak
4 srcdir=/etc
5 [ -e $bakdir ] ||mkdir $bakdir
6 tar -zcvf $bakdir/$baknamefile-etc.tar.gz $srcdir
7 echo "====================="
8 ls -lh $bakdir/$baknamefile-etc.tar.gz
9 echo "backup is ok "
10
标签:语句,10,read,流程,number,echo,测试,var,fi
From: https://www.cnblogs.com/kcloveworld/p/17984478