linux系统常见的命令行解释器有许多,常用的是sh和bash,其实sh是bash的一个软链接,还是调用的bash。
脚本以#!/bin/bash开头,指定命令行解释器为bash。
创建一个helloworld.sh,内容如下:
#!/bin/bash
echo 'hello world'
执行脚本
bash helloworld.sh
常用的系统变量:
$HOME: 当前系统用户目录
$PWD: 当前工作目录的绝对路径
$SHELL: 当前使用的Shell解释器
$USER: 当前用户名
NAME=John # 变量定义:变量=值, 注意等号前后不能有空格
echo $NAME # 输出变量值
unset NAME # 撤销变量
$n: n为数字,$0为脚本名,$1为脚本第一个参数,$2为脚本第二个参数...,第10及以上个参数访问需加大括号${10}
$#: 获得脚本参数的个数,常用于循环
$*: 获取所有参数,将所有参数看成一个整体 ??
$@: 获取所有参数,将参数区分开来
$?: 返回最后一次执行的命令的状态,如果为0表示上条命令执行成功
$((运算式)) 或 $[运算式]
expr +,-,*,/,% 加减乘除取余
expr运算符间要有空格
s=$[(2+3)*4]
echo $s # 输出20
expr 2 + 3 # 此种形式运算符前后必须要有空格
[ condition ]:condition前后要有空格,condition非空即返回true,[]返回false
两个整数之间比较
符号 描述
-lt (less than)小于
-le (less equal) 小于等于
-eq (equal)等于
-gt (greater than) 大于
-ge (greater equal) 大于等于
-ne (not equal) 不等于
文件权限判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
文件类型判断
-f 文件存在并且是一个常规文件
-e 文件存在
-d 文件存在并是一个目录
[linux@localhost datas]$ [ 23 -gt 2 ]
[linux@localhost datas]$ echo $?
0
[linux@localhost datas]$ [ -w helloworld.sh ]
[linux@localhost datas]$ echo $?
1
[linux@localhost datas]$ [ -e /home/linux/datas ]
[linux@localhost datas]$ echo $?
0
[ condition1 ] && [ condition2 ]: condition1执行成功才执行condition2
[ condition1 ] || [ condition2 ]: condition1执行失败才执行condition2
if [ 条件判断式1 ];then
程序
elif [ 条件判断式2 ];then
程序
fi
或
if [ 条件判断式1 ]
then
程序
elif [ 条件判断式2 ]
then
程序
fi
注:
case $变量名 in
"值1") # 实际代码中不要加“”,shell中变量类型默认是字符串
程序1
;;
"值2")
程序2
;;
*)
其它
;;
esac
for((初始值; 循环控制条件; 变量变化))
do
程序
done
或
for 变量名 in 参数1 参数2 参数3
do
程序
done
#求和
s=0
for((i=0; i<=100; i++))
do
s=$[$s+$i]
done
echo $s
#打印所有的输入参数
for i in $*
do
echo $i
done
while [ condition ]
do
程序
done
注:
read(选项)(参数)
选项:
-p: 指定读取值时的提示符
-t: 指定读取值时的等待时间
参数:
变量: 指定读取值时的变量名
# 提示7s内读取控制台输入的名称
read -p "input your name" -t 7 NAME
echo $NAME
basename [文件路径/文件名] [后缀]
提取文件名,如果指定后缀,会将文件名的后缀去掉
basename /home/gh/test.txt .txt # 返回test
basename /home/gh/test.txt # 返回test.txt
返回文件的绝对路径,从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录部分)
dirname /hone/gh/test.txt # 返回/home/gh
function sum()
{
s=0
s=$[$1+$2] # $1表示函数sum接收的第一个参数
echo $s
}
read -p "请输入第一个参数:" P1
read -p "请输入第二个参数:" P2
sum $P1 $P2 # 由于shell脚本是逐行运行,函数必须先定义再调用
cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出
cut [选项参数] filename
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分隔列
[linux@localhost datas]$ cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[linux@localhost datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
# 获取第三行第一个单词
[linux@localhost datas]$ cat cut.txt | grep guan | cut -d " " -f 1
guan
sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出。
sed [选项参数] ‘command’ filename
选项参数说明:
命令功能描述
a 新增
d 删除
s 查找并替换
# 将test插入test.txt的第二行
sed -i "2a test" test.txt
# 删除test.txt中所有包含wo的行
sed "/wo/d" test.txt # 增加在前删除在后
# 将test.txt文件中的wo替换成ni
sed "s/wo/ni/g" # g表示全局替换,如果不加g则只替换第一个
# 将test.txt文件中的第二行删除并将wo替换成ni
sed -e "2d" -e "s/wo/ni/g" test.txt
awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
awk [选项参数] ‘pattern1 {action1} pattern2{action2}…’ filename
选项参数:
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。
(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。