Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
外层应用程序 -> Shell -> Linux内核 -> 硬件
命令行解释器 >> bash
Shell解析器:sh zsh bash dash…
查看默认解析器:echo $SHELL
第一行需要指定解析器
#!/bin/bash
#!/bin/bash
echo "Hello world"
$ bash test.sh
需要先给定权限
chmod +x test.sh
执行文件
./test.sh
#!/bin/bash
cd ~/Desktop
touch a.txt
echo "i love wc" >> a.txt
作用域:(系统变量)整个操作系统、(用户变量)整个用户
修改系统变量:vi /etc/profile
修改用户变量:vi ~/.bashrc
执行修改:source /etc/profile
查看系统变量的值:echo $USER
、echo $PWD
查看所有系统变量:printenv
、set
自定义用户变量:export TEST_C=300
--> 临时变量(当前bash以及子bash)
作用域:当前的Shell(当前的解释器)
定义变量:A=3
删除变量:unset A
静态变量(不可被修改):readonly A=3
变量名称可以由字母、数字和下划线组成,但是不能以数字开头
环境变量名建议全大写
等号两侧不能有空格
变量的值如果有空格,需要使用双引号或单引号括起来
$n
功能描述:n为数字,$0
代表该脚本名称,$1-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#
功能描述:获取所有输入参数个数,常用于循环
$*
、 $@
$*
:这个交量代表命令行中所有的参数,$*
把所有的参数看成一个整体
$@
:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待
wmh@Mac Desktop % zsh test.sh 123 456
123 456
------
123
456
------
123
456
------
123
456
#!/bin/zsh
for i in "$*"; do
echo $i
done
echo "------"
for j in "$@"; do
echo $j
done
echo "------"
for k in $*; do
echo $k
done
echo "------"
for l in $@; do
echo $l
done
$?
功能描述:最后一次执行的命令的返回状态。如果这个交量的值为0,证明上一个命令正确执行;如果这个交量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
反引号(`):作为一条完整的命令,并且保留结果
1、$((运算式))
2、$运算式
3、expr +, -, *, /, %
加,减,乘,除,取余(expr运算符间要有空格)
#!/bin/bash
A=100
B=2
#第一种写法
C=$((A+B))
echo $C
#第二种写法
D=$[A+B]
echo $D
#第三种写法
E=`expr $A + $B`
echo $E
#综合运算 (2+3)*5
F=$[(2+3)*5]
echo $F
expr `expr 2 + 3` \* 5
[ condition ]
(注意condition前后要有空格)
条件非空即为true,[ rexhao ]返回true,[]返回false。
任何命令的执行状态为0则为True,否则为False
=
:字符串比较
-lt
:小于 (less than)
-le
:小于等于 (less equal)
-eq
:等于 (equal)
-gt
: 大于 (greater than)
-ge
:大于等于 (greater equal)
-ne
:不等于 (Not equal)
-r
:有读的权限 (read)
-w
:有写的权限 (write)
-x
:有执行的权限 (execute)
-f
:文件存在并且是一个常规的文件 (file)
-e
:文件存在 (existence)
-d
:文件存在并是一个目录 (directory)
#!/bin/zsh
[ $# -gt 2 ] && echo "参数的个数大于2"
[ $# -le 2 ] || echo "参数的个数大于2"
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
#!/bin/bash
if [ $1 -eq 1 ]; then
echo "密码正确"
elif [ $1 -ne 1 ];then
echo "密码错误"
fi
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
相当于default
;;
esac
in
,每一个模式匹配必须以有括号)
结束。;;
表示命令序列结束,相当于java中的break。*)
表示默认模式,相当于java中的default。for((初始值;循环控制条件;变量变化)); do
程序
done
1-100求和案例
#!/bin/bash
ans=0
for (( i = 0; i < 10000; i++ )); do
ans=$[$i+$ans]
done
echo $ans
for 变量 in 值1 值2 ...; do
程序
done
1-100求和案例
#!/bin/bash
ans=0
for i in {1..100}; do
ans=$[$i+$ans]
done
echo $ans
#!/bin/bash
ans=0
for i in `seq 1 100`; do
ans=$[$i+$ans]
done
echo $ans
while [ condition ]; do
程序
done
1-100求和案例
#!/bin/zsh
i=1
sum=0
while [ $i -le 100 ]; do
let sum=sum+i # 相当于 sum=$[$sum+$i]
let i++
done
echo $sum
read(选项)(参数)
-p:读取的提示符
-t:等待时间
#!/bin/bash
i=1
sum=0
read -p "请输入n:" n
while [ $i -le $n ]; do
let sum=sum+i # 相当于 sum=$[$sum+$i]
let i++
done
echo "1到$n的和是$sum"
功能描述:basename命令会删掉所有的前缀包括最后一个(\
) 字符,然后将字符串显示出来。
dirname 文件绝对路径:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
wmh@Mac Desktop % basename ~/Desktop/test.sh
test.sh
wmh@Mac Desktop % dirname ~/Desktop/test.sh
/Users/wmh/Desktop
[function] funname[()] {
程序
[return int]
}
%?
系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)return并不十分真正的返回值,而是函数执行状态
#!/bin/bash
add(){
sum=$[$1+$2]
echo $sum
}
echo `add 100 200`
#!/bin/bash
fact(){
if [[ $1 -eq 1 ]]; then
echo 1
else
echo $[`fact $[$1-1]`*$1]
fi
}
echo `fact $1`