bash特殊字符

一.小括号(( ))

命令组:

在括号中的命令列表,将会作为一个子 shell 来运行。

在括号中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的。父进程,也就是脚本本身,将不能够读取在子进程中创建的变量,也就是在子 shell 中创建的变量。如:

vim test20.sh

输入代码:

#!/bin/bash

a=123

( a=321; )

echo "$a" #a的值为123而不是321,因为括号将判断为局部变量

运行代码:

bash test20.sh

123

在圆括号中 a 变量,更像是一个局部变量。

初始化数组:

创建数组:

vim test21.sh

输入代码:

#!/bin/bash

arr=(1 4 5 7 9 21)

echo ${arr[3]} # get a value of arr

运行代码:

bash test21.sh

7

二.大括号({ })

文件名扩展

复制 t.txt 的内容到 t.back 中

vim test22.sh

输入代码:

bash 复制代码
#!/bin/bash

if [ ! -w 't.txt' ];
then
    touch t.txt
fi
echo 'test text' >> t.txt
cp t.{txt,back}

运行代码:

bash test22.sh

查看运行结果:

ls

cat t.txt

cat t.back

注意: 在大括号中,不允许有空白,除非这个空白被引用或转义。

代码块:

代码块,又被称为内部组,这个结构事实上创建了一个匿名函数(一个没有名字的函数)。然而,与"标准"函数不同的是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的。

vim test23.sh

输入代码:

bash 复制代码
#!/bin/bash

a=123
{ a=321; }
echo "a = $a"

运行代码:

bash test23.sh

a = 321

变量 a 的值被更改了。

三.中括号([ ])

条件测试

条件测试表达式放在 [ ] 中。下列练习中的 -lt (less than)表示小于号。

vim test24.sh

输入代码:

bash 复制代码
#!/bin/bash

a=5
if [ $a -lt 10 ]
then
    echo "a: $a"
else
    echo 'a>=10'
fi

运行代码:

bash test24.sh

a: 5

双中括号([[ ]])也用作条件测试(判断)。

数组元素:

在一个 array 结构的上下文中,中括号用来引用数组中每个元素的编号。

vim test25.sh

输入代码:

bash 复制代码
#!/bin/bash

arr=(12 22 32)
arr[0]=10
echo ${arr[0]}

运行代码:

bash test25.sh

10

四.尖括号(< 和 >)

重定向:

test.sh > filename:重定向 test.sh 的输出到文件 filename 中。如果 filename 存在的话,那么将会被覆盖。

test.sh &> filename:重定向 test.sh 的 stdout(标准输出)和 stderr(标准错误)到 filename 中。

test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。

test.sh >> filename:把 test.sh 的输出追加到文件 filename 中。如果 filename 不存在的话,将会被创建。

五.竖线(|)

管道

分析前边命令的输出,并将输出作为后边命令的输入。这是一种产生命令链的好方法。

vim test26.sh

输入代码:

bash 复制代码
#!/bin/bash

tr 'a-z' 'A-Z'
exit 0

现在让我们输送 ls -l 的输出到一个脚本中:

chmod 755 test26.sh

ls -l | ./test26.sh

输出的内容均变为了大写字母。

六.破折号(-)

选项,前缀

在所有的命令内如果想使用选项参数的话,前边都要加上"-"。

vim test27.sh

bash 复制代码
#!/bin/bash

a=5
b=5
if [ "$a" -eq "$b" ]
then
    echo "a is equal to b."
fi

运行代码:

bash test27.sh

a is equal to b.

用于重定向 stdin 或 stdout:

下面脚本用于备份最后 24 小时当前目录下所有修改的文件.

vim test28.sh

输入代码:

bash 复制代码
#!/bin/bash

BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在备份文件中嵌入时间.
archive=${1:-$BACKUPFILE}
#  如果在命令行中没有指定备份文件的文件名,
#  那么将默认使用"backup-MM-DD-YYYY.tar.gz".

tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."

exit 0

运行代码:

bash test28.sh

ls

七.波浪号(~)

目录

~ 表示 home 目录。

相关推荐
内核程序员kevin40 分钟前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海5 小时前
scala String
大数据·开发语言·scala
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习