第十章-sh编程技术

第十章 sh编程

20201303张奕博

sh脚本

sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。

创建mysh:
#!/bin/bash
#comment line
echo hello
使用 chmod -x mysh 使其可执行,然后运行mysh。

sh脚本与C程序

sh脚本和C程序有一些相似之处,但它们在根本上是不同的。

sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。sh脚本不需要main函数,第一个可执行语句是程序的入口点。
C语言必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件,每个变量必须有一个类型,必须有main()函数。

命令行参数

可使用与运行sh命令完全相同的参数调用sh脚本,如

mysh one two three

可通过位置参数$0、$1、$2等访问命令行参数

可用内置变量#和*计数并显示命令行参数


'#' = 命令行参数\(1到\)n的数量
"*"= 所以命令行参数,包括$0
S = 执行sh的进程PID
? = 最后一个命令执行的退出状态


sh变量

内置变量

PATH、HOME、TERM等
变量赋值
variable=string
sh中的引号
sh中的特殊字符,如$、/、*、>、<等,要想把它们用作普通字符,可使用\或单引号来引用它们

sh命令(书上摘录,不全)

内置命令
.file:读取并执行文件
break [n]:从最近的第n个嵌套循环中退出
cd [dirname]:更换目录
continue [n]:重启最近的第n个嵌套循环
eval [arg...]:计算一次参数并让sh执行生成的命令。
exec [arg...]:通过这个sh执行命令,sh将会退出。
exit [n]:使sh退出,退出状态为n。
export [var…]:将变量导出到随后执行的命令.
trap [arg] [n]:接收到信号n后执行参数。
umask [ddd]:将掩码设置为八进制数 ddd 的。
wait pid]: 等待进程 pid,如果没有给出pid,则等待所有活动子进程。
read命令:当sh执行read命令时,它会等待来自stdin的输入行。

实例1:

管道命令:在sh中经常使用管道作为过滤器

ps -ax | grep httpd
cat file | grep word

*其他实用命令:

axk:数据处理程序。
cmp:比较两个文件。
comm:选择两个排序文件共有的行。
grep:匹配一系列文件的模式。
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件。
sed:流或行编辑命令。
sort:排序或合并文件。
tail:打印某个文件的最后口行。
tr:一对一宇符翻译。
uniq:从文件中删除连续重复行。

命令替换

sh控制语句

  • if-else-fi语句
    if [condition]
    then
    statemates
    else
    statements
    fi
    -运算符 -eq -ne -lt -gt
  • if-elif-else-fi语句
    if [condition];then
    commands
    elif [condition2];then
    commands
    else
    commands
    fi
  • for语句
    for VARIABLE in string1 string2 ... stringn
    do
    commands
    done
  • while语句
    while [condition]
    do
    commands
    done
  • until-do语句
    until [$ANS = "give up"]
    do
    echo -n "enter your answer"
    read ANS
    done
  • case 语句
    case $variable in
    pattern1) commands;;
    pattern2) commands;;
    patternn) commands;;
    esac

实例2:

I/O重定向

I/O重定向用于捕获一个文件、命令、程序或脚本甚至代码块的输出,然后把捕获到的输出作为输入发送给另外一个文件、命令、程序或脚本等。I/O重定向最常用的方法是管道(管道符"|")。

(https://blog.csdn.net/taiyang1987912/article/details/39401265)

sh函数定义

func()
{
# function code
}

实例3:

sh通配符

:可扩展到当前目录中的所有文件
?:查询文件名中的字符
[]:查询文件名中一对[]中的字符
eval语句
eval是sh的一个内置命令,将输入参数字符串连接到一个字符串中,然后给出结果字符串

*调试sh脚本

bash -x mysh

问题与解决思路

问题:shell编程出现报错(sh Syntax error:"("unexpected)
解决:查询网络,得知将VPS重新安装为Debian,通过sh ./virtualmin.sh执行代码就报“Syntax error: “(” unexpected”错误
输入sudo dpkg-reconfigure dash 在选择项中选否,就不报错了。
(https://blog.csdn.net/u014470581/article/details/51493150/)

实例4:sh脚本实现递归

代码:

#!/bin/bash

N=$1
RET=1

function multi()
{
    local LOCAL_N=$1
    local LOCAL_N_SUB_1=$(($LOCAL_N - 1))

    if [ $LOCAL_N_SUB_1 -lt 1 ]
    then
        RET=1
    else
        multi $LOCAL_N_SUB_1
        RET=`expr $LOCAL_N \* $RET`
    fi
}

multi $N

echo $RET

posted @ 2022-09-18 22:50  20201303张奕博  阅读(160)  评论(0编辑  收藏  举报