shell 通配符
3、通配符和正则表达式比较
(1)通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。
(2)*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个字符,不能独立使用的。比如通配符可以用*来匹配任意字符,而正则表达式不行,他只匹配任意长度的前面的字符。
(3)使用场景:通配符 是文件名。正则表达式 文本内容
(4) 使用命令 通配符 find rm ls cp 由shell解析; 正则表达式 vi grep sed awk
sh新建一个子shell进程,变量在主shell中无法获取 source在当前shell中执行脚本,变量在主shell即当前shell中可以获取
例子:
1.新建一个test.sh脚本,内容为:A=1
2.然后使其可执行chmod +x test.sh
3.运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell
4.运行./test.sh后,也是一样的效果
5.运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中
拓展: source filename 等价于 . filename 文件没有执行权限也可以;而sh file.sh 等价于 ./file.sh(执行表示当前路径下的file.sh) 当然如果全路径就是/xx/xx.sh了 文件要有执行权限
1、shell检测某一文件是否存在
当你在#shell#中需要检查一个文件是否存在时,通常需要使用到文件操作符-e
和-f
。第一个-e
用来检查文件是否存在,而不管文件类型。第二个-f
仅仅用来检查文件是常规文件(不是目录或设备)时返回true。
2、shell检测某一目录是否存在
Linux系统中运算符-d
允许你测试一个文件是否时目录。
例如检查/etc/docker
目录是否存在,你可以使用如下脚本:
3.检查文件是否不存在
4、检查是否存在多个文件
不使用复杂的嵌套if/else构造,您可以使用-a(或带[[的&&预算符)来测试是否存在多个文件,示例如下:
参考:https://baijiahao.baidu.com/s?id=1767844801168947948&wfr=spider&for=pc
shell 判断文件夹或文件是否存在
文件夹不存在则创建
if [ ! -d "/data/" ];then mkdir /data else echo "文件夹已经存在" fi
文件存在则删除
if [ ! -f "/data/filename" ];then echo "文件不存在" else rm -f /data/filename fi
判断文件夹是否存在
if [ -d "/data/" ];then echo "文件夹存在" else echo "文件夹不存在" fi
判断文件是否存在
if [ -f "/data/filename" ];then echo "文件存在" else echo "文件不存在" fi
文件比较符
-e 判断对象是否存在 -d 判断对象是否存在,并且为目录 -f 判断对象是否存在,并且为常规文件 -L 判断对象是否存在,并且为符号链接 -h 判断对象是否存在,并且为软链接 -s 判断对象是否存在,并且长度不为0 -r 判断对象是否存在,并且可读 -w 判断对象是否存在,并且可写 -x 判断对象是否存在,并且可执行 -O 判断对象是否存在,并且属于当前用户 -G 判断对象是否存在,并且属于当前用户组 -nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ] -ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
https://www.runoob.com/note/47027
参考: shell脚本中空格的注意问题
1. =
赋值时:两边不能有空格
(())内外部括号之间无空格,( () )这样报错。但内部括号内不限制,随便如s=$(( $i+1 ))可以
还有${path} 无空格。
i=1
i=$((i+1))
比较时:两边必须有空格
if [ $a = $b ]
2. if
整数比较时:中括号前后必须有空格
if [ a -xx b ]
参考: Linux#Shell#if [ $# -ne 1 ];then 是什么意思?
看来双括号还有问题…再学吧…
1. 变量名、等号、值之间不能有空格
2. 变量的引用是用 $ 符号加上变量名
echo ${a}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,建议给所有变量加上花括号,这是个好习惯,既便于阅读,又不易出错。
3 条件比较 = 前后都需要空格
4. if 需要 then ; elif 也需要then
5.操作符之间需要空格 test ! -d $1 ; 其中的!与-d 需要隔开
6.命令与对象之间需要空格 if [ -x "/root/a.sh" ];then if 中换一行的执行语句开头,不强制需要空格。
7.A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A。 A=$(ls -la) 等价于反引号
8.[ 和test 是 Shell 的内部命令,而[[是Shell的关键字
前言
首先在Shell中,括号表示条件测试方法。主要用在if-then、case等需要条件判断的语句结构中。
最近在看bash,括号搞的我一头雾水,所以总结一下,理清思路!
括号
- 括号一般在命令替换的时候使用。
#!/bin/bash
today=$(date +%y%m%d)
touch log.$today
双括号
- 使用双括号,在比较过程中使用高级数学表达式
符号 | 描述 | |
---|---|---|
val++ | 后增 | |
val-- | 后减 | |
++val | 先增 | |
--val | 先减 | |
! | 逻辑求反 | |
~ | 位求反 | |
** | 幂求反 | |
<< | 左位移 | |
>> | 右位移 | |
&& | 逻辑和 | |
逻辑或 |
$ cat test23.sh
#!/bin/bash
val1=10
if(( $val1 ** 2 > 90 ))
then
((val2 = $val1 ** 2))
echo "The square of $val1 is $val2"
fi
# seal @ bogon in ~/Desktop/Shell [16:48:19]
$ ./test23.sh
The square of 10 is 100
- 注意,不需要将双括号中表达式里的大于号转义。这是双括号命令提供的另一个高级特性。
方括号
-
方括号定义了测试条件。
-
第一个方括号后和第二个方括号前都要加一个空格,否则会报错。
-
方括号主要包括4类判断:
- 数值比较
比较 描述 n1 -eq n2 检查n1是否与n2相等 n1 -ge n2 检查n1是否大于或等于n2 n1 -gt n2 检查n1是否大于n2 n1 -le n2 检查n1是否小于或等于n2 n1 -lt n2 检查n1是否小于n2 n1 -ne n2 检查n1是否不等于n2 #!/bin/bash # Using numeric test evaluations value1=10 value2=11 # if [ $value1 -gt 5 ] then echo "The test value $value1 is greater than 5" fi # if [ $value1 -eq $value2 ] then echo "The values are equal" else echo "The values are different" fi #
- 字符串比较
比较 描述 str1 = str2 检查str1是否和str2相同 str1 != str2 检查str1是否和str2不同 str1 < str2 检查str1是否比str2小 str1 > str2 检查str1是否比str2大 -n str1 检查str1的长度是否非0 -z str1 检查str1的长度是否为0 $ cat test8.sh #!/bin/bash # testing string equality testuser=baduser # if [ $USER != $testuser ] then echo "This is not $testuser" else echo "Welcome $testuser" fi $ $ ./test8.sh This is not baduser
- 文件比较
比较 描述 -d file 检查file是否存在并是一个目录 -e file 检查file是否存在 -f file 检查file是否存在并是一个文件 -r file 检查file是否存在并可读 -s file 检查file是否存在并非空 -w file 检查file是否存在并可写 -x file 检查file是否存在并可执行 -O file 检查file是否存在并属当前用户所有 -G file 检查file是否存在并且默认组与当前用户相同 file1 -nt file2 检查file1是否比file2新 file1 -ot file2 检查file1是否比file2旧 $ cat test11.sh #!/bin/bash # Look before you leap # jump_directory=/home/arthur # if [ -d $jump_directory ] then echo "The $jump_directory directory exists" cd $jump_directory ls else echo "The $jump_directory directory does not exist" fi # $ $ ./test11.sh The /home/arthur directory does not exist
- 符合条件比较
[ condition1 ] && [ condition2 ] [ condition1 ] || [ condition2 ]
双方括号
- 双方括号提供了字符串比较的高级特性。
- 括号中可以定义一些正则表达式来匹配字符串
- 注意不是所有的shell都支持双方括号!
$ cat test24.sh
#!/bin/bash
if [[ $USER == s* ]]
then
echo "Hello Seal"
else
echo "Sorry, I do not know you"
fi
# seal @ bogon in ~/Desktop/Shell [17:36:57]
$ ./test24.sh
Hello Seal
来自:https://www.jianshu.com/p/3e1eaaa3fee8
方括号与双方括号的区别: [ 和test 是 Shell 的内部命令,而[[是Shell的关键字
$test -f settings.py && echo True
True
$[ -f settings.py ] && echo True
True
[
和test
是相等的。
$[ 2 < 1 ] && echo True || echo False
True
$[[ 2 < 1 ]] && echo True || echo False
False
既然是命令, 它就和参数组合为一体被 shell 解释,那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。
在[[
中使用&&
和||
表示逻辑与和逻辑或。[
中使用-a
和-o
表示逻辑与和逻辑或。
$[[ 'abcd' == a*d ]] && echo True || echo False
True
$[ 'abcd' == a*d ] && echo True || echo False
False
[[
支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
总结:
使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,
但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]
如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]
或者if [ $a -ne 1 -a $a != 2 ]
bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
$[ !(pip list | grep pip) ] && echo True || echo False
-bash: [: too many arguments
False
$[[ !(pip list | grep pip) ]] && echo True || echo False
True
https://www.cnblogs.com/zeweiwu/p/5485711.html
2023.6.16
标签:脚本,shell,是否,echo,学习,括号,sh,file From: https://www.cnblogs.com/rebrobot/p/17486182.html