shell解析器
在/etc/shells 目录下
我们一般使用sh,bash这两个
其实sh还是调用的bash
查看默认解析器:
echo $SHELL
第一个shell脚本程序“hello world”
上代码:
#!/bin/bash
2
3 echo "hello world!"
第一行的/bin/bash 指定使用bash解析器解析脚本,这个主要是你给文件加上可执行权限后,./执行的时候默认使用你指定的shell解析器,当然你也可以在命令行用
bash test.sh
#或者是
sh test.sh
第二个shell脚本 多命令操作
上代码:
#!/bin/bash
2
3 touch file1.txt
4 echo "I love xxx!" > file1.txt
Shell变量
自定义变量:
A=1
等号两侧不能有空格
静态变量:
readonly B=1
撤销变量:unset A
静态变量不可撤销
bash中变量默认都是字符串类型,无法直接进行运算
such as:
A=1+1
变量的值如果有空格,在赋值时需要用单引号或双引号括起来:
$n
就是命令行参数
$0代表命令本身,就是你的shell脚本名称,
1
−
9
就是你在命令行上输入的参数,类似于
m
a
i
n
函数的第二个参数
c
h
a
r
∗
a
r
g
v
[
]
,
大于
10
个参数要用
1-9就是你在命令行上输入的参数,类似于main函数的第二个参数char* argv[] , 大于10个参数要用
1−9就是你在命令行上输入的参数,类似于main函数的第二个参数char∗argv[],大于10个参数要用{10}表示
1 #!/bin/bash
2
3 echo "$0 $1 $2 $3"
$#
类似于main函数的第一个参数,argc,代表输入的命令行参数个数,不过跟main
函数不同的是,这个$#个数不带命令本身,只包括命令后面跟着的参数的个数
1 #!/bin/bash
2
3 echo "$0 $1 $2 $3"
4 echo "$#"
$* and $@
∗
这个变量代表命令行中所有的参数,
* 这个变量代表命令行中所有的参数,
∗这个变量代表命令行中所有的参数,*把所有的参数看成是一个整体
$@ 这个变量也代表命令行中所有的参数,不过它把每个参数区分对待
1 #!/bin/bash
2
3 echo "$0 $1 $2 $3"
4 echo "$#"
5 echo "$*"
6 echo "$@"
这两个函数的区别我们后面详细展开
$?查看进程退出码
之前有关进程退出的博客提到过
进程退出,结果正确为0,进程退出,结果错误为1.
进程崩溃,没意义。
运算符
- $((运算式)) 或 $[运算式]
- expr + , - , * , / , % 加 减 乘 除 取余
expr运算符之间需要有空格
**`**的含义跟()差不多,优先运算。
条件判断
基本语法
[ condition ]
condition前后需要有空格
执行完闭后可以用$?查看退出码,为0就是满足条件,为1就是不满足
常用判断条件
- 两个整数之间比较
= :字符串比较
-lt:小于
-le:小于等于
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
- 按照文件权限进行判断
-r:有读的权限
-w:有写的权限
-x:有可执行的权限
- 按照文件类型进行判断
-f:文件存在,并且是一个常规的文本文件
-e:文件存在
-d:文件存在,并且是一个目录
if判断
基本语法
if [ condition ];then
···
fi
或者是
if [ condition ]
then
···
fi
写个shell脚本,当输入参数为1时,输出“这是功能1”,当输入参数为2时,输出“这是功能2”
输入参数为其他时,输出defult
1 #!/bin/bash
2
3 if [ $1 -eq 1 ]
4 then
5 echo "这是功能1"
6 elif [ $1 -eq 2 ]
7 then
8 echo "这是功能2"
9 else
10 echo "defult!"
11 fi
case语句
case $变量名 in
"值1")
···
;;
"值2")
···
;;
*)
···
;;
esca
代码示例:
1 #!/bin/bash
2
3 case $1 in
4 1)
5 echo "这是功能1"
6 ;;
7 2)
8 echo "这是功能2"
9 ;;
10 *)
11 echo "defult"
12 ;;
13 esac
14
for循环
基本语法1
for((初始值;循环控制条件;变量变化))
do
···
done
案例:从1加到100
1 #!/bin/bash
2
3 s=0;
4 for((i=0;i<=100;i++))
5 do
6 s=$[$s+$i]
7 done
8
9 echo $s
基本语法2
for 变量名 in 值1,值2,···
do
···
done
把后面的值依次赋给变量,循环执行后面的语句
代码示例:
1 #!/bin/bash
2
3
4 for i in $*
5 do
6 echo $i
7 done
8
9 for i in $@
10 do
11 echo $i
12 done
13
14 #for i in "$*"
15 #do
16 # echo $i
17 #done
18 #
19 #for i in "$@"
20 #do
21 # echo $i
22 #done
当$@
∗
都没加双引号时,结果是一样的,都是循环赋值,然后打印出来当加引号时,
*都没加双引号时,结果是一样的,都是循环赋值,然后打印出来 当加引号时,
∗都没加双引号时,结果是一样的,都是循环赋值,然后打印出来当加引号时,*是把你输入的所有参数当作一个整体赋给i,只循环一次全部打印出来
而$@依旧是一个个地打印
while循环
基本语法
while [ condition ]
do
···
done
read读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间
参数:
变量:
指定读取值时的变量名
示例:
1 #!/bin/bash
2
3 read -t 7 -p "please enter your name:>" NAME
4 echo $NAME
basename函数
提取文件名
basename 路径+文件名 后缀
没后缀的话,直接把文件名提取出来,有后缀的话就是提取出去掉后缀的文件名
eg:
dirname函数
提取文件路径
dirname 绝对路径+文件名
提取出除了文件名地路径
eg:
自定义函数
基本语法
[ function ] funname[()]
{
···
[ return int ]
}
funname
[]里面的内容都是可有可无
输入两个参数,求和并输出
代码示例:
1 #!/bin/bash
2
3 function sum()
4 {
5 s=0
6 s=$[$1+$2]
7 echo $s
8 }
9
10 read -p "please type first num:" num1
11 read -p "please type second num:" num2
12
13 sum $num1 $num2
cut命令
按列切割,并且输出指定列
基本语法
cut 选项参数 filename
选项参数:
-d:分隔符,按照指定分隔符分割列
-f:列号提取第几列
比如输出PATH环境变量第二个冒号后面的所有内容
echo $PATH | cut -d ":" -f 3-
3-就是输出第三列以及后面所有列