export 变量名
env 显示环境变量
set 显示全局变量
export AA=20 习惯大写
readonly aa 不能修改也不能删除
位置参量,类似于C中的int main(int argc,char *argv[])
数组定义:str=(math english good)
echo ${str[*]} 全部打印
echo ${#str[*]} 元素个数
echo ${str[0]} 第一个元素
read var 从标准输入获取,赋给var(局部)
read 标准输入读取一行并赋给内置变量REPLY
read -a arr 读取一组词,依次赋给arr
read -p "input please:" -t 10 -a arr 标准输入,随即输出到设备
echo -n "hello world" 后面就不会跟上换行
echo -e "\t"a 转义
echo `pwd` 或者 echo $(pwd) 命令嵌套
echo $[$n+1] 里边有没有空格都可以
echo $(($n+1)) 同上
((n+=1)) echo $n 或 echo $((n+=1))
expr 4 + 5 加号两边必须有空格
r=`expr 4 + 5` echo $r
let "n=n+1"
let "n=n+abc"
x=5;y=10; test $x -gt $y echo $?
字符串测试,两边必须有空格:
str=abc [ -z $str ] 为空时返回0,也就是真
[ -n $str ] 不为空时返回真,0
[ "$str1" = "$str2" ] 判断相等
[ "$str1" != "$str2" ] 不等
整数测试:
[ $int1 -gt $int1 ]
[ $int1 -lt $int2 ]
[ $int1 -ne $int2 ]
[ $int1 -ge $int2 ]
[ $int1 -le $int2 ]
整数测试也可以用let或双圆括号测试:
x=1 let "x == 1" echo $? ((x >=2)) 他们相应的操作符为 = > < >= <= != let 和双圆括号中有没有空格都可以
x=1;name=Tom
[ $x -gt 1 -a -n $name ] echo $?
[[ $x -ge 1 && -n $name ]] echo $? 也是可以的,类似与C
[ $name = " " ] 检查是否为空值,两边必须有空格
test [] 基本是可以互换的。
#!/bin/bash
if [ $1 -lt "10" ]
then
<span style="white-space:pre"> </span>echo "$1 < 10 "
elif [ $1 -gt "10" -a $1 -lt "50" ]
then
<span style="white-space:pre"> </span>echo "10< $1< 50"
else
<span style="white-space:pre"> </span>echo hehe
fi
case $1 in
A)
<span style="white-space:pre"> </span>echo it is A
<span style="white-space:pre"> </span>;;
b|B)
<span style="white-space:pre"> </span>echo it is B or b
<span style="white-space:pre"> </span>;;
*)
<span style="white-space:pre"> </span>echo other
easc
for i in 1 2 3 4 5
do
<span style="white-space:pre"> </span>echo the value is $i
done
for i in $*
do
<span style="white-space:pre"> </span>echo $i
done
接下来就替换文件名:
#!/bin/bash
for i in *
do
<span style="white-space:pre"> </span>counter=$[counter+1]
done
echo there are $counter file in $(pwd)
更通用的for:
#!/bin/bash
if [ $# -ne "1" ]
then
echo "error"
<span style="white-space:pre"> </span>exit 1
fi
if [ $1 -lt "5" -o $1 -gt "15" ]
then
<span style="white-space:pre"> </span>echo "error error"
<span style="white-space:pre"> </span>exit 1
fi
for((i=0;i<$1;i++))
do
<span style="white-space:pre"> </span>for((j=0;j<$[$1-$i-1];j++))
<span style="white-space:pre"> </span>do
<span style="white-space:pre"> </span>echo -n " "
<span style="white-space:pre"> </span>done
<span style="white-space:pre"> </span>for((j=0;j<$[$i*2-1];j++))
<span style="white-space:pre"> </span>do
<span style="white-space:pre"> </span>echo -n "*"
<span style="white-space:pre"> </span>done
<span style="white-space:pre"> </span>echo # 相当于 echo -ne "\n"
done
</pre><pre name="code" class="html">
while:
</pre><pre name="code" class="html">while [ $curline -lt $line ]
do
<span style="white-space:pre"> </span>nspace=$[$line-$curline-1]
<span style="white-space:pre"> </span>while [$nspace -gt 0]
<span style="white-space:pre"> </span>do<span style="white-space:pre"> </span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>echo -n " "</span>
<span style="white-space:pre"> </span>done
<span style="white-space:pre"> </span>nstar=$[2*$curline+1]
<span style="white-space:pre"> </span>while [ $nstar -gt 0 ]
<span style="white-space: pre;"> </span>do
<span style="white-space:pre"> </span>echo -n "*"
<span style="white-space:pre"> </span>done
<span style="white-space:pre"> </span>echo
`<span style="white-space:pre"> </span>curline=$[$curline+1]
done
</pre><pre name="code" class="html">#!/bin/bash
counter=0
until [ $counter -eq 3 ]
do
<span style="white-space:pre"> </span>echo $counter
<span style="white-space:pre"> </span>sleep
<span style="white-space:pre"> </span>counter=$[$counter+1]
done
#until 与其他恰恰相反,退出状态非0,进入循环。也就是条件成立时却退出循环。
</pre><pre name="code" class="html">
select 循环
#!/bin/bash
select var in man woman
do
case $var in
man)
<span style="white-space:pre"> </span>echo man is my favourite
<span style="white-space:pre"> </span>;;
woman)
<span style="white-space:pre"> </span>ehco woman is my favourite
<span style="white-space:pre"> </span>;;
*)
<span style="white-space:pre"> </span>echo i like all
esac
break
done
</pre><pre name="code" class="html">
#!/bin/bash
fun()
{
<span style="white-space:pre"> </span>echo good morning
<span style="white-space:pre"> </span>echo hello world
}
fun #调用
</pre><pre name="code" class="html">echo $RANDOM 生成随机数
expr 5 / 3
expr 5 \* 3 #两边必须有空格
</pre><pre name="code" class="html">
while [ $1 != "" ]
do
<span style="white-space:pre"> </span>echo $* #$1
<span style="white-space:pre"> </span>shift
done
</pre><pre name="code" class="html">
字符串操作
var=abacde
echo ${#var} 字符个数
echo ${var:3} 显示索引从 3开始的所有字符
echo ${var:2:3} 从3开始的长度
echo ${var/a/b} 将第一次出现的a替换
echo ${var//a/b} 全部替换
sed 流编辑器。sed是一个精简的,非交互式的流编辑器。它在命令行中输入编辑命令和指定的文件名,查看输出。逐行读取文件内容到临时缓冲区,这一切操作并不会改变文件本身的内容。
sed '4,$d' test.in 这个索引是从1开始的,从第四行都删除,只显示前三行。
sed '3q' test.in 只显示前三行
sed 's/hello/wold/' test.in 将每一行第一次出现的hello替换成world
sed -n 's/hello/world/p' test.in 只将有改动的部分打印出来
指定多个命令的方法:
; sed 's/hello/1/;s/world/2/' test.in
-e sed -e 's/hello/1/' -e 's/world/2/' test.in
分行命令: sed '
> s/hello/1/
> s/world/2/' test.in
也可以这样,将命令打包成文件。用-f来指定
在test.sed 中: s/hello/1/;s/world/2/
sed -f test.sed test.in
sed -n '3,5p' test.in 打印三到五行
sed -n '$p' test.in 值打印最后一行,, 其实可以将-n理解成‘相关操作’
sed -n '/hello world/=' test.in 所匹配的行号
sed -n '/hello world/d' test.in 删除匹配的行
sed '/moringin/a\AAA\
BBB\
CCC' test.in
sed '/moringin/i\AAABBBCCC' test.in
sed -n '/moringin/l' test.in 输出指定行的全部字符(非打印字符除外)
s 替换命令
sed -n 's/hello/baby/gp' test.in
p 打印修改后的行
sed '$r test2.in' test1.in 将2文件的内容读到1的末尾
awk 是一种用于处理数据和生成报告的编程语言。linux下使用的awk是gwk
可以使用重定向将输出保存到文件中。
-F 指定输入记录字段的分隔符默认使用环境变量IFS的值。
-f 从指定文件读取awk_script
-v 为awk设定变量
。。。