1、什么是Shell?
- Shell是核心程序(kernel)之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。
- Shell环境:只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
- Shell的类型sh、ash、bash、ksh、csh、tcsh、dash等
- cat /etc/shells #查看当前系统支持的Shell类型
- echo $SHELL #查看当前系统默认使用的Shell类型
- 当前系统支持的Shell类型可以互相切换(如输入命令:/bin/csh ,则当前使用的是csh类型,退出当前的csh,执行exit)
#查看系统支持的类型
[root@hadoop02 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
#查看系统默认的类型
[root@hadoop02 ~]# echo $SHELL
/bin/bash
#支持的类型之间可以相互切换,如切换为/bin/csh
[root@hadoop02 ~]# /bin/csh
#切换后尝试执行以下ls命令,可以执行
[root@hadoop02 ~]# ls
anaconda-ks.cfg
Desktop
......
#退出刚才的切换执行,退回到/bin/bash
[root@hadoop02 ~]# exit
exit
#查看当前使用的类型
[root@hadoop02 ~]# echo $SHELL
/bin/bash
2、Shell脚本的编写与执行
- vim 脚本名称.sh (如:vim Demo1.sh) #直接用vi/vim 编辑 xxx.sh文件即可。
- (建议先cd切换进入自己用来保存Shell脚本的目录下,接下来的操作建立在新建的用于存放Shell脚本的 /root/Desktop/shell01目录下);
- 进入编辑脚本程序的第一行输入:#!/bin/bash (#! 是一个约定的标记,告诉系统这个脚本需要用的解释器,用哪一类型的Shell);
- 然后写入程序内容,保存并退出。
- 添加文件可执行权限(chmod +x Demo1.sh);
- 最后用 sh Demo1.sh 命令执行脚本。
[root@hadoop02 shell01]# echo $SHELL
in/bash
[root@hadoop02 shell01]# vim Demo1.sh
#!/bin/bash ## 脚本使用的解释器,通常用幻数 "#!" 指定
echo "hello world !"
~
"Demo1.sh" 3L, 97C written
[root@hadoop02 shell01]# chmod +x Demo1.sh
[root@hadoop02 shell01]# ll
total 4
-rwxr-xr-x. 1 root root 97 Oct 17 19:41 Demo1.sh
[root@hadoop02 shell01]# sh Demo1.sh
hello world !
3、Shell echo命令、Shell 变量
echo表示输出:
[root@hadoop02 shell01]# vim Demo0.sh
#!/bin/bash
echo "OK!"
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo -e "xiaoxiao \n" # -e 开启转义 \n 换行
echo -e "OK! huahua\n"
#显示结果定向至文件
echo -e "OK! xiaoxiao" > myfile.txt
#显示结果追加至文件
echo -e "OK! \n huahua" >> myfile.txt
~
"Demo0.sh" [New] 8L, 280C written
[root@hadoop02 shell01]# sh Demo0.sh
OK!
OK! xiaoxiao
OK! huahua
[root@hadoop02 shell01]# cat myfile.txt
OK! xiaoxiao
OK!
huahua
定义变量注意:
- 定义变量时,变量名不加美元符号($,PHP语言中变量需要),
- 变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样
- 变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
- 如:your_name="baidu.com"
- 除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in
ls /etc
或for file in $(ls /etc)以上语句将 /etc 下目录的文件名循环出来。
使用变量:echo ${变量名}
其中{},变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
[root@hadoop02 shell01]# vim Demo.sh
#!/bin/bash
you_name="baidu.com"
echo ${you_name}
for skill in Ada Coffe Action Java;
do
echo "I am good at ${skill}Script"
done
"Demo.sh" 9L, 136C written
[root@hadoop02 shell01]# sh Demo.sh
baidu.com
I am good at AdaScript
I am good at CoffeScript
I am good at ActionScript
I am good at JavaScript
只读变量:readonly 变量名
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
删除变量:unset 变量名
变量被删除后不能再次使用。unset 命令不能删除只读变量。
变量类型:
运行shell时,会同时存在三种变量:
- 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。