shell编程:解释型语言 ---- 运行时需要一个解释器来解释执行 (同为解释型语言的还有python)
c语言:编译型语言
shell是一个作为用户与Linux系统间接口的程序,他允许用户向操作系统输入需要执行的命令。
变量
(本地变量 环境变量 参数变量)
在shell里,使用变量之前通常并不需要事先为他们做出声明,只是在给他们赋初值时来创建他们。
默认情况下,所有变量都被看做字符串并以字符串来存储。
#!/bin/bash //使用该解释器
myvar="Hello World"
echo $myvar //$ 表示取myvar的值
echo "$myvar" // "" 加双引号表示的同上
echo '$myvar' //''单引号不会发生替换
echo \$myvar //在$前面加\可以取消$的特殊含义
#!/bin/bash
fun()
{
local mystr=hello
//只定义一个mystr是可以被该函数外部访问的,但是加上local就不可以。或者在函数结束加unset mystr
echo "fun run"
echo "\$#=$#"
echo "\$1=$1"
echo "\$2=$2"
unset mystr
}
fun hello abc 1234
echo "$mystr"
echo "my.sh run"
echo "\$#=$#"
echo "\$1=$1"
echo "\$2=$2"
运行shell程序的方法:
- bash my.sh
- chmod u+x my.sh (先改变权限) ./my.sh
比较
控制结构
if elif else fi
#!/bin/bash echo "stdin" //手动输入 read line //读取一行(读取输入的) //下面就是if else if else 具体的应用 if [ "$line" = "3" ] then echo "is 3" elif [ "$line" = "1" ] then echo "is 1" else echo "no" fi
for 转自https://www.cnblogs.com/EasonJim/p/8315939.html
第一类:数字性循环 ----------------------------- for1-1.sh #!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done ----------------------------- for1-2.sh #!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done ----------------------------- for1-3.sh #!/bin/bash for i in {1..10} do echo $(expr $i \* 3 + 1); done ----------------------------- for1-4.sh #!/bin/bash awk 'BEGIN{for(i=1; i<=10; i++) print i}' 第二类:字符性循环 ----------------------------- for2-1.sh #!/bin/bash for i in `ls`; do echo $i is file name\! ; done ----------------------------- for2-2.sh #!/bin/bash for i in $* ; do echo $i is input chart\! ; done ----------------------------- for2-3.sh #!/bin/bash for i in f1 f2 f3 ; do echo $i is appoint ; done ----------------------------- for2-4.sh 复制代码 #!/bin/bash list="rootfs usr data data2" for i in $list; do echo $i is appoint ; done 复制代码 第三类:路径查找 ----------------------------- for3-1.sh #!/bin/bash for file in /proc/*; do echo $file is file path \! ; done ----------------------------- for3-2.sh #!/bin/bash for file in $(ls *.sh) do echo $file is file path \! ; done
while
#!/bin/bash i=0 while [ : ] //死循环 do printf "this is $i th\n" let "i+=1" if [ "$i" -eq "3" ] then break fi done
case
#!/bin/bash echo "stdin" read line while [ "$line" != "end" ] do case "$line" in yes | y ) echo "this is yes" ;; no | n ) echo "this is no" ;; * ) echo "*****" ;; esac echo "stdin" read line done
命令
- break 跳出循环
- : 相当于true的别名
- continue 跳到下一次循环继续执行,循环变量取循环列表中的下一个值
- . . ./shell 默认情况下,当一个脚本执行一条外部命令或脚本程序时,会创建一个新的环境,命令将在这个新的环境中执行。在命令执行完毕后,该环境被丢弃。但是,source命令和点命令在执行命令时,使用该脚本程序的同一个shell。
- echo 输出结尾带有换行符的字符串
- eval 允许你对参数进行求值,有点像一个额外的$,它给出一个变量的值的值。
- exec
- exit n 使脚本程序以退出码n结束运行
- export 将作为它参数的变量导出到子shell中,并使之在子shell中有效。
- expr 将它的参数作为一个表达式来求值
- 等等...... 更多命令参考《Linux程序设计第4版》2.6.5
脚本里调用c程序,直接写 ./main (main 函数名)
c程序里面调脚本程序 创建一个子进程,在子进程里调用