Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
…
Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#!/bin/bash
echo "Hello World !"
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到该脚本,要用 ./test.sh 告诉系统,在当前目录找。
/bin/sh test.sh
my_name="worthsen"
如将 /etc 下目录的文件名循环出来。
for file in `ls /etc`
或
for file in $(ls /etc)
使用一个定义过的变量,只要在变量名前面加美元符号 $ 即可,如:
my_name="worthsen"
echo $my_name
echo ${my_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,如下:
若写成 $skilllanguage,则变量为skilllanguage,就不能正确实现自己所写的逻辑。
for skill in C C++ C#; do
echo "I am good at ${skill}language"
done
使用 readonly 命令可以将变量定义为只读变量
#!/bin/bash
readonly my_name="worthsen"
echo $my_name
使用 unset 命令可以删除变量
unset my_name
#!/bin/sh
my_name="worthsen"
echo $my_name
unset my_name
字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
str='this is a string'
#!/bin/sh
my_name='worthsen'
echo $my_name
str='$my_name'
echo $str
str="$my_name"
echo $str
my_name='\"worthsen\"'
echo $my_name
my_name="\"worthsen\""
echo $my_name
运行结果
worthsen
$my_name
worthsen
\"worthsen\"
"worthsen"
#!/bin/sh
my_name='worthsen'
# 使用双引号拼接
str0="hello, "$my_name" !"
str1="hello, ${my_name} !"
echo $str0 $str1
# 使用单引号拼接
str2='hello, '$my_name' !'
str3='hello, ${my_name} !'
echo $str2 $str3
运行结果
hello, worthsen ! hello, worthsen !
hello, worthsen ! hello, ${my_name} !
#!/bin/sh
my_name='worthsen'
echo ${#my_name}
结果为 8
第一个字符的索引值为 0。
#!/bin/sh
my_name='worthsen'
echo ${my_name:5:7}
结果为 sen
查找字符 s 或 o 的位置(哪个字母先出现就计算哪个):
注:以下脚本中` 是反引号,而不是单引号 ’
#!/bin/sh
my_name='worthsen'
echo `expr index "$my_name" so`
结果为 2
Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。一般形式如下
数组名=(值1 值2 ... 值n)
array=(v0 v1 v2)
或者
array=(
v0
v1
v2
)
或者
array[0]=v0
array[1]=v1
array[n]=vn
可以不使用连续的下标,而且下标的范围没有限制。
#!/bin/sh
array=(v0 v1 v2)
# 读取数组元素 ${数组名[下标]}
echo ${array[0]}
echo ......
# 读取整个数组 ${数组名[@]}
echo ${array[@]}
运行结果
v0
......
v0 v1 v2
#!/bin/sh
array=(v0 v1 v2)
# 获取数组长度 ${#数组名[@]}
echo ${#array[@]}
# 获取数组长度 ${#数组名[*]}
echo ${#array[*]}
# 获取单个元素长度 ${#数组名[下标]}
echo ${#array[1]}
运行结果
3
3
2
以 # 开头的行就是注释,会被解释器忽略。
#!/bin/bash -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#added by worthsen
echo "worthsen"
#end
exit 0
#!/bin/bash
:<
1、runoob-Shell 教程
2、Linux之Shell语法详解
3、Shell——你只需要了解这么多