bash入门

来源: 实验楼
链接: https://www.shiyanlou.com/courses/944

简书

https://www.jianshu.com/p/e1c8e5bfa45e

Bash(GNU Bourne-Again Shell)是一个为GNU计划编写的Unix shell,它是许多Linux平台默认使用的shell。

shell是一个命令解释器,是介于操作系统内核与用户之间的一个绝缘层。准确地说,它也是能力很强的计算机语言,被称为解释性语言或脚本语言。它可以通过将系统调用、公共程序、工具和编译过的二进制程序”粘合“在一起来建立应用,这是大多数脚本语言的共同特征,所以有时候脚本语言又叫做“胶水语言”

shell本身是一个命令解释器,介于操作系统的内核(kernel)态和用户态之间,可以执行系统调用及系统命令等,让用户以此来与操作系统实现互动。同时,它也用来指一种计算机程序语言(类似于C、Python等)。一个shell程序一般被称为一个脚本

目前,shell主要有两大流派:

  • sh:
    • burne shell (sh)
    • burne again shell (bash)
  • csh:
    • c shell (csh)
    • tc shell (tcsh)
    • korn shell (ksh)

目前,大部分Linux系统预设的shell都是bash

[email protected]:~/.ssh$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash

你可以用 locate bash ,find / -name bash 2>/dev/null 或 whereis bash 这三个命令找出 bash 所在的位置

[email protected]:~/.ssh$ local bash
bash: local: can only be used in a function

[email protected]:~/.ssh$ find / -name bash 2>/dev/null
/bin/bash
/usr/share/lintian/overrides/bash
/usr/share/menu/bash
/usr/share/doc/bash
/etc/apparmor.d/abstractions/bash

[email protected]:~/.ssh$ whereis bash
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

事实上,所有的UNIX命令和工具再加上公共程序,对于shell脚本来说,都是可调用的。Shell脚本对于管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟紧凑的编译型程序语言。

$ vim hello.sh
 #!/bin/bash
 # This is a comment
 echo Hello World

#! 是说明 hello 这个文件的类型,有点类似于 Windows 系统下用不同文件后缀来表示不同文件类型的意思(但不相同)。
Linux 系统根据 "#!" 及该字符串后面的信息确定该文件的类型,可以通过 man magic命令 及 /usr/share/magic 文件来了解这方面的更多内容。
在 BASH 中 第一行的 "#!" 及后面的 /bin/bash 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下,如果你的 Linux 系统比较特别,bash 也有可能被存放在 /sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或 /usr/local/sbin 这样的目录下;如果还找不到,你可以用 locate bash ,find / -name bash 2>/dev/null 或 whereis bash 这三个命令找出 bash 所在的位置;如果仍然找不到,那你可能需要自己动手安装一个 BASH 软件包了。
第二行的 "# This is a ..." 就是 BASH 程序的注释,在 BASH 程序中从“#”号(注意:后面紧接着是“!”号的除外)开始到行尾的部分均被看作是程序的注释。
第三行的 echo 语句的功能是把 echo 后面的字符串输出到标准输出中去。由于 echo 后跟的是 "Hello World" 这个字符串,因此 "Hello World"这个字串就被显示在控制台终端的屏幕上了。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。

# 使用shell来执行
$ sh hello.sh
# 使用bash来执行
$ bash hello.sh
使用.来执行
$ . ./hello.sh
使用source来执行
$ source hello.sh
还可以赋予脚本所有者执行权限,允许该用户执行该脚本
$ chmod u+rx hello.sh
$  ./hello.sh

#!/bin/bash这一行是表示使用/bin/bash作为脚本的解释器,这行要放在脚本的行首并且不要省略
脚本正文中以#号开头的行都是注释语句,这些行在脚本的实际执行过程中不会被执行。这些注释语句能方便我们在脚本中做一些注释或标记,让脚本更具可读性。

#!/bin/bash

# 初始化一个变量
LOG_DIR=/var/log

cd $LOG_DIR

cat /dev/null > wtmp

echo "Logs cleaned up."

exit

由于脚本中含有对系统日志文件内容的清除操作,这要求要有管理员权限.不然会报permission denide错误

使用sudo命令调用管理员权限才能执行成功:

$ sudo ./cleanlogs.sh
#!/bin/bash这一行是表示使用/bin/bash作为脚本的解释器,这行要放在脚本的行首并且不要省略

权限不够加sudo啊,可是你会发现

sudo cat /dev/null > /var/log/wtmp 一样会提示权限不够,为什么呢?因为sudo只能让cat命令以sudo的权限执行,而对于>这个符号并没有sudo的权限,我们可以使用

sudo sh -c "cat /dev/null > /var/log/wtmp " 让整个命令都具有sudo的权限执行

 

来源: 实验楼
链接: https://www.shiyanlou.com/courses/944

简书

https://www.jianshu.com/p/e1c8e5bfa45e

你可能感兴趣的:(bash入门)