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 引号
image.png
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
posted @ 2018-08-21 21:02  默写年华  阅读(280)  评论(0编辑  收藏  举报