Bash脚本基础
1. Hello World
#!/bin/bash
# This is a comment
echo Hello World
- Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,可以通过 man magic命令 及 /usr/share/magic 文件来了解这方面的更多内容。
在 BASH 中 第一行的 "#!" 及后面的 /bin/bash 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下 - 第二行的 "# This is a ..." 就是 BASH 程序的注释,在 BASH 程序中从“#”号(注意:后面紧接着是“!”号的除外)开始到行尾的部分均被看作是程序的注释。
2. 运行bash脚本的方式:
# 使用shell来执行
$ sh hello.sh
# 使用bash来执行
$ bash hello.sh
使用.来执行
$ . ./hello.sh
使用source来执行
$ source hello.sh
还可以让脚本本有者该执行权限,允许该用户执行该脚本
$ chmod u+rx hello.sh
# 执行命令,这身就具有可执行权限,通过chmod命令可以修改:
# 赋予脚本的所将使用脚本第一行指定的shell来执行,如果指定shell不存在,将使用系统默认shell来执行
$ ./hello.sh
3. 使用重定向>
echo 默认是定向到屏幕上,我们可以把echo后面内容定向到txt文件中
#!/bin/bash
echo "Hello World" > my.txt
4. 使用脚本清除/var/log下的log文件
sudo vi clean.sh
#进入编辑模式
#!/bin/bash
#初始化一个变量
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > wtmp
echo "Logs clean up"
exit
由于脚本中含有对系统日志文件内容的清除操作,这要求要有管理员权限.不然会报permission denide错误
使用sudo命令调用管理员权限才能执行成功:$ sudo ./cleanlogs.sh
- 权限不够加sudo啊,可是你会发现
sudo cat /dev/null > /var/log/wtmp
一样会提示权限不够,为什么呢?因为sudo只能让cat命令以sudo的权限执行,而对于>这个符号并没有sudo的权限,我们可以使用
sudo sh -c "cat /dev/null > /var/log/wtmp "
让整个命令都具有sudo的权限执行
5. 特殊字符
5.1 #
注释
#!/bin/bash
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The # 这里开始一个注释
echo $(( 2#101011 )) # 数制转换(2转10),不是一个注释,双括号表示对于数字的处理
5.2 分号 ;
- 命令间隔符
#!/bin/bash
echo hello; echo there
filename=ttt.sh
if [ -e "$filename" ]; then # 注意: "if"和"then"需要分隔,-e是判断文件存在否,注意中括号空格
echo "File $filename exists."; cp $filename $filename.bak
else
echo "File $filename not found."; touch $filename
fi; echo "File test complete."
- 终止case选项(双分号
;;
)
#!/bin/bash
varname=b
case "$varname" in
[a-z]) echo "abc";;
[0-9]) echo "123";;
esac #shell使用与case相反的字符来配对表示结束
输出:
$ bash test3.sh
abc
- 点号(.)
等价于source
命令,用于在当前bash环境读取并执行FileName.sh中的命令
$ source test.sh
Hello World
$ . test.sh
Hello World
5.3 引号
5.4 斜杠(/
)
文件名路径分隔符,注意在linux中表示路径的时候,许多个/跟一个/是一样的。/home/shiyanlou等同于////home///shiyanlou
- 反斜杠(\):转义
5.5 反引号(`)
命令替换:反引号中的命令会优先执行比如:
cp `mkdir back` test.sh back
先创建了 back 目录,然后复制 test.sh 到 back 目录
5.6 冒号(😃
- 空命令,等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。“:”命令是一个bash的内建命令,它的退出码(exit status)是(0)。
#!/bin/bash
while :
do
echo "endless loop"
done
等价于:
#!/bin/bash
while true
do
echo "endless loop"
done
可以在 if/then 中作占位符:
#!/bin/bash
condition=5
if [ $condition -gt 0 ] #gt表示greater than,也就是大于,同样有-lt(小于),-eq(等于)
then : # 什么都不做,退出分支
else
echo "$condition"
fi
- 变量扩展与子串替换
在与>重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件。
$ : > test.sh # 文件“test.sh”现在被清空了
# 与 cat /dev/null > test.sh 的作用相同
# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
- ":"还用来在 /etc/passwd 和 $PATH 变量中做分隔符,如:
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
5.7 美元符号($)
变量替换
#!/bin/bash
var1=5
var2=23skidoo
echo $var1 # 5
echo $var2 # 23skidoo