C/C++与shell的区别
C/C++是编译型 编译链接xx.c->xx 二进制机器指令
shell编程解释型 xx.sh 需要解释器(如:bash)
Java 解释器+编译 xx.java->xx.class 配置环境
输出一个hello
my.sh
#!/usr/bin/bash/
echo"hello"
exit 0
执行
方法一:bash my.sh
方法二:chmod u+x my.sh 给权限
./my.sh 运行
变量
#屏蔽--注释
#!指定解释器
用a的值,在a前面加一个$: $a
想要输出值--用双引号:echo" "
想要输出字面--用单引号:echo‘ ’
等号两边不能有空格
·expr 算式·
三种变量:本地变量、环境变量、参数变量
#本地变量
str = hello
a = "123"
echo "a=$a"
#环境变量-内部就有的
$HOME 家
$PATH
$PS1
$$ pid
$0 名字
$# 传给脚本的参数个数
#参数变量
$1 传给脚本的第一个参数
$2
$3 传给脚本的第三个参数
条件
test或[ ] 判断
[] 左右两边要有空格
if语句
if [ ]
then
...
elif [ ]
then
...
else
...
fi
字符串比较
判断里面的等号要有空格,要不然就是赋值了。
算术比较
文件测试
循环
在语句中执行命令str=$(ls)
或者str=`ls`
for循环
#循环三次
for i in 1 2 3
do
done
#循环多次--把文件夹中所有文件都循环一遍
str=$(ls)
for i in $str
do
echo i=$i
sleep
done
while循环
#!/sur/bin/bash
i=0
while [ "$i" -lt 10 ]
do
echo "i=$i"
sleep 1
i=`expr $i + 1`
done
#死循环
#while true
#while [ : ]
until循环
直到[ 条件 ],相当于while条件取反
until [ -f a.txt ]
do
echo "not find a.txt"
sleep 1
done
echo "find a.txt"
函数
调用函数直接使用函数名,不用加(),脚本也没有所谓的主函数。
#!/usr/bin/bash
fun()
{
echo "fun run"
}
#调用fun函数
fun
echo "main run"
参数
给函数传参直接在调用的后面加参数
如:fun 1234 abab
$?表示上一行的值,可以获取函数返回结果
或者直接用变量-变量在脚本中没有范围限制。
限制变量范围:
因为变量没有范围限制,若想撤销变量,可以用unset;
local修饰变量也可以将他变为局部变量。
case语句
case 判断 in
匹配) 操作;;
esac
echo "input:"
read line
case $line in
yes | y ) echo "this is yes";;#|表示或者
no) echo "this is no";;
*) echo "***";;#其他
esac
匹配时用中括号可以表示一系列[0-9][Yy][a-w]:0到9,Y或y,a到w。
脚本的调用
当前脚本调用另一个脚本,参数打不出来,pid不同。
但在a中用.命令,pid相同,可以把mystr打印出来
. ./b.sh或source ./b.sh
将变量变成环境变量: export 环境变量名
在C代码中调用脚本
产生一个子进程,把它替换成脚本
execl("./b.sh","b.sh",(char*)0);
awk生成报表
从已有的文件中取用户想要的, awk -F+分隔符,‘{print 列数}’ file
运用:
用脚本找到sleep程序的pid然后kill他们。
sed非交互式流文本编辑器
操作文件的副本
例如: