输入
#!/bin/bash
echo “Hello World !”
#运行Shell脚本
chmod +x ./test.sh # 使脚本具有可执行权限
./test.sh #执行脚本
注:test.sh 直接写 unix-like 系统或去Path 里寻找有没有叫做test.sh的文件 通常只有/bin,/sbin,/usr/bin,/usr/sbin在Path中, ./test.sh告诉系统在当前目录下寻找
定义变量
your_name=“GreenDan”
命名规则跟其他的语言基本相似
使用变量 :在前面加一个$符号
your_name="GreenDan"
echo $your_name
# 加花括号是为了分清便捷
echo ${your_name}
shell
只读变量 readonly
readonly your_name
删除变量 unset 命令
unset your_name
字符串可以用单引号,双引号也可以不用引号,单双引号的区别跟其php类似
单引号里的任何字符都会原样输出,单引号中定义字符串是无效的。
单引号字串不能出现单独的一个单引号(使用转义字符也不行)但可以成对出现,用于拼接字符串
双引号里可以有变量
双引号中可以出现转义字符
获取字符串的长度
echo ${#string}
提取子串
echo ${string :1:4}
shell获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
shell 注释
以#号为注释,没加一行就多一个注释
多行注释可以定义成函数的形式来注释
:<<EOF
注释内容
EOF
Shell 参数传递
用$n 来传参,n代表数字,0代表文件名,1代表第一个参数,以此类推
实
#!/bin/bash
#author:GreenDan
echo "shell 传参实例";
echo "执行的文件名:$0";
echo "第一个参数:$1";
echo "第二个参数:$2";
echo "第三个参数:$3";
chmod +x 传参.sh
./传参.sh 1 2 3
几个特殊字符来处理参数
参数 | 实现功能 |
---|---|
$# | 显示传递到脚本的参数个数 |
$* | 显示所有的参数,比如用 “$*”, 在双引号中输出所有的参数 “$1 $2 $n” |
$$ | 显示脚本运行的当前进程的ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同 区别在于"$1" “$2” “$3” “$4” |
$? | 显示最后命令的退出状态,0表示没有错误,其他值表示有错误 |
1.显示普通字符串
2.显示转移字符串
3.显示变量
4.显示换行
5.显示不换行
6.显示结果定向的文件
7.原样输出字符串,不进行转义或取变量(用单引号)
8.显示命令结果
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串测试
|参数|说明|
|:-?:-?
|=|等于则为真|
|!=|不等于则为真|
|-z 字符串|字符串长度为零则为真|
|-n 字符串|字符串长度不为零为真|
文件测试
|参数|说明|
|:-?:-:]
|-e 文件名| 文件存在为真|
|-r 文件名|文件存在且可读为真|
|-w 文件名|文件存在且可写为真|
|-x 文件名|文件存在且可执行为真|
|-s 文件名|文件存在且至少有一个字符串为真|
|-d 文件名|如果文件存在期望为目录则为真|
|-f 文件名| 如果文件存在且为普通文件则为真|
|-c 文件名|如果文件存在且为字符型特殊文件则为真|
|-b 文件名|如果文件存在且为快特殊文件则为真|
if-elif-else语句
if [ $a == $b]
then
echo "if"
elif [$a -gt $b]
then
echo "elif"
else
echo "else"
fi
for 语句
for var in items
do
commands
done
while
where ((something))
do
commands
done
无限循环
while :
do
commands
done
或者
while true :
do
commands
done
或者
for(( ; ; ))
until循环
循环执行一条命令知道为true为止,与while相反
until condition
do
commands
done
case
为多选择语句
case value in
value1)
commands
;;
value2)
commands
;;
*)
esac
*)相当于default
break 与continue
与其他语言的一致
break跳出整个循环,continue,跳出当前循环,继续执行循环
case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。
. filename
或
source filename