一、Shell的HelloWorld
#!/bin/bash
echo “HelloWorld!”
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
运行方法有两种:
./helloworld.sh
/bin/sh helloworld.sh(这种运行方式是作为解释器的参数,.sh文件第一行不需要#!)
二、Shell的变量
1.定义变量
变量名和等号之间不能有空格;
命名只能使用字母数字下划线,且不能以数字开头;
中间不能有空格;
不能使用标点符号;
不能使用bash里的关键字。
2.使用变量 使用一个定义过的变量,${变量名} 即可({}是为了帮解释器识别变量边界)
3.只读变量 使用readonly命令将变量定义为只读,只读变量的值不可更改
4.删除变量 unset
5.shell的字符串 可以用单引号,也可以用双引号,也可以不用引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号里可以有变量;双引号里可以出现转义字符。
${#变量名}可以获取字符串长度;
${变量名:1:5}从字符串第2个字符开始截取5个字符;
6.Shell中支持一维数组,用括号表示数组,数组元素以空格分割;${数组名[index]}读取数组,${数组名[@]}可以获取数组中所有元素;${数组名[@]}或者${数组名[*]}获取数组中元素个数,${数组名[index]}获取某个元素的长度。
7.shell的注释 #就是注释,没有多行注释。想要注释多行可以用{}定义成一个函数,不调用不执行
三、shell传递参数
./test.sh a b c
使用$n可以获取到传递的参数,$0为文件名,$1为a,$2为b,$3为c,依次类推…
$# 获取传递的参数个数
$*或者$@ 获取所有参数,$*将所有参数以一个字符串的形式获取到,$@获取每个参数
$$ 后台运行的最后一个进程的ID号
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
四、shell的echo和printf命令
输出命令,printf不会自动换行,需要手动添加\n,printf支持格式替代符
扩展:格式说明符详细说明
① d格式:用来输出十进制整数。有以下几种用法:
%d:按整型数据十进制的实际长度输出。
%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
%ld:输出长整型数据。
② o格式:以无符号八进制形式输出整数。
%d:按整型数据八进制的实际长度输出。
%lo:对长整型可以用格式输出
%mo:指定字段宽度用格式输出
③ x格式:以无符号十六进制形式输出整数。
%x:按整型数据十六进制的实际长度输出。
%lx:对长整型可以用格式输出
%mx:指定字段宽度用格式输出
④ u格式:以无符号十进制形式输出整数。
%u:按无符号整型数据十进制的实际长度输出。
%lu:对长整型可以用格式输出
%mu:指定字段宽度用格式输出
⑤ c格式:输出一个字符。
⑥ s格式:用来输出一个串。有几中用法
%s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。
%ms:输出的字符串占m列,如字符串长度大于m,将字符串全部输出。若串长小于m,则左补空格。
%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
⑦ f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
%f:不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
⑧ e格式:以指数形式输出实数。可用以下形式:
%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
%m.ne和%-m.ne:m、n和”-”字符含义与前相同。
此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
⑨ p格式:输出指针地址
五、shell的流程控制
1.if语句
if condition
then
command1
command2
...
commandN
fi
2.if-else
if condition
then
command1
command2
...
commandN
else
command
fi
3.if-else if-else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
4.for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
5.while循环
while condition
do
command
done
while死循环
while : while true
do do
command command
done done
6.until循环
until condition
do
command
done
7.case in
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
六、shell的函数
[ function ] funname [()]{
action;
[return int;]
}
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数;
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
七、shell的重定向
命令 | 说明 |
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
八、shell的文件包含
Shell支持外部脚本,格式为:
. 空格文件名 或者source 文件名
Shell将字符串拆分成数组
fileName="/home/a.txt"
for i in `cat${fileName}`
do
OLD_IFS="$IFS"
IFS=","
arr=($i)
IFS="$OLD_IFS"
doCheck ${arr[0]} ${arr[1]} ${arr[2]}
done
arr=($a)用于将字符串$a分割到数组$arr${arr[0]} ${arr[1]} ... 分别存储分割后的数组第1 2 ... 项,${arr[@]}存储整个数组。变量$IFS存储着分隔符,这里我们将其设为逗号 "," OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认。
Shell逐行读文件的4种方法
1.while循环
function while_read_LINE_bottm(){
While read LINE
do
echo $LINE
done < $FILENAME
}
2.
Function While_read_LINE(){
cat $FILENAME | while read LINE
do
echo $LINE
done
}
3.for循环
function for_in_file(){
For i in `cat $FILENAME`
do
echo $i
done
}
4.
Function while_read_line_fd(){
Exec 3<&0
Exec 0<$FILENAME
While read LINE
Do
Echo $LINE
Exec 0<&<3
}