《Unix/Linux系统编程》第三周学习笔记


《Unix/Linux系统编程》第三周学习笔记

sh编程

sh脚本

#! /bin/bash
# comment line
echo hello
  • chmod +x mysh使其可执行 sh脚本的第一行通常以#!组合开始,通 常称为shebang。当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。shebang允许主sh调用适当 版本的sh来执行脚本。如果未指定shebang,它将运行默认的sh,即Linux中的/bin/bash。 当bash执行mysh脚本时,将会打印hello。
    《Unix/Linux系统编程》第三周学习笔记

sh脚本于C语言程序

  • sh:sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行 命令且为内置命令,那么Sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。
  • C程序:C程序必须先编译链接到一个二进制可执行文件.然后通过主sh的子进程运行二进制可执行文件。

命令行参数

在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前10个命令行参数可以作为$0~$9被访问。其他参数必须称为~${n},其中n>10o可以通过稍后显示 的shift命令査看它们。通常,$0是程序名本身,$1到$n是程序的
参数,在sh中,可用内置变量$#和$*计数并显示命令行参数。
$# = 命令行参数$1到$n的数量
$* = 所有命令行参数,包括$0,此外,,sh还有与命令执行相关的以下内置变量。
$S = 执行sh的进程PID
$? = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0 )
#! /bin/bash
echo /$# = $#
echo /$* = $*
echo $1 $9 $10
echo $1 $9 %{10}
shift #replace $1,$2with $2,$3
echo $1 $9 

《Unix/Linux系统编程》第三周学习笔记
《Unix/Linux系统编程》第三周学习笔记

sh变量

  • sh有许多内置变量,如PATH、HOME、TERM等。除了内置变量外,用户还可使用 任何符号作为sh变量。未赋值的sh变量是NULL字符串。
  • 赋值方式:variable = string
#! /bin/bash
echo A
echo $A
A="this is fun"
echo $A
B=A  # B和等于号必须要贴贴 b = a是不行的
echo $B
B=$A
echo $B 

《Unix/Linux系统编程》第三周学习笔记

sh中的引号

  • Sh有许多特殊字符,如$/* 等。要想把它们用作普通字符,可使用'或单引号来引用它们。
  • '用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换
#! /bin/bash
A=XYZ
echo /$A
echo '$A'
echo "see $A"

《Unix/Linux系统编程》第三周学习笔记

sh语句

  • sh语句包括所有Unix/Linux命令,以及可能的I/O重定向
#! /bin/bash
ls
ls > outfile 
date
cp fl f2
mkdir newdir 
cat < filename

运行如下
《Unix/Linux系统编程》第三周学习笔记
《Unix/Linux系统编程》第三周学习笔记
《Unix/Linux系统编程》第三周学习笔记

sh命令

内置命令

  • 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 ...]:将变量导岀到随后执行的命令。
  • read[var...]:从stdin中读取一行并为变量赋值。
  • set[arg ...]:在执行环境中设置变量。
  • shift:将位置参数S2 $3 …重命名为$1 S2…。
  • trap[arg][n]:接收到信号n后执行参数。
  • umask[ddd]:将掩码设置为八进制数ddd的。
  • wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
  • read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为几个标记,分配给列岀的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。
#! /bin/bash
echo -n "enter yes or no:"
read ANS
echo $ANS

《Unix/Linux系统编程》第三周学习笔记

linux 命令

  • echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压 缩为一个空格,除非有引号。
#! /bin/bash
echo This  is   a line
echo "This is    a    line"
echo -n hi #-n 不换行
echo   there

《Unix/Linux系统编程》第三周学习笔记

  • expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。expr命令间接更改sh变量的值(数值)
    expr string1 op string2
#! /bin/bash
i=123
echo $i
i=$i+1
echo $i
i=123
i=$(expr $i + 1)
echo $i

《Unix/Linux系统编程》第三周学习笔记

  • 管道命令:在sh脚本中经常使用管道作为过滤器。
#! /bin/bash
ps -ax | grep httpd
cat file | grep word

《Unix/Linux系统编程》第三周学习笔记
《Unix/Linux系统编程》第三周学习笔记
实用命令:除了上面的linux命令之外,sh还有使用很多其他实用程序作为命令。

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

命令替换

  • $A会被替换成A的值。
  • $(cmd) 先运行cmd命令将成果替换成$(cmd)的值。
#! /bin/bash
echo $(date)
echo $(ls /home/hzx)

《Unix/Linux系统编程》第三周学习笔记

sh控制语句

  • sh:是一种编程语言,支持许多执行控制语句,类似于c语言中的语句

if-else-fi 语句

if [ condition ]
  then
    statements
  else
    statements
fi
字符串比较
if [ si = s2 ]	# NOTE: white spaces needed between tokens
if [ si 1= s2 ]
if [ si /< s2 ]	# /< because < is a special char
if [ si /> s2 ] etc. # /> because > is a special char
test stringl COMP string2 OR [ stringl COMP string2 】 #比较两个字符串
文件比较
if [ -e name ]  # test whether file name exists
if [ -f name ]  # test whether name is a (REG) file
if [ -d name ]  # test whether name is a DIR 
if [ -r name ]  # test whether name is readable; similarly for -w, -xr etc.
if [ f1 -e f2 ]  # test whether fl, £2 are the SAME file
if-elif-else-fi
if [ conditionl ]; then
    commands
  elif [ condition2 ]; then
    commands
# additional elif [ conditions ]; then etc.
  else
    commands
fi

复合条件:与在C语言中一样,sh也允许在复合条件中使用&& (AND)和||(0R), 但是语法比C语言更加严格。条件必须用一对匹配的双括号[[和]]括起来。
[: test string1 COMP string2 OR [ string1 COMP string2]

sh中

0:表示TRUE
非零:表示FASLE

#! /bin/bash
read ANS
echo $ANS
if [ "$ANS" -eq "20201310" ]
    then
       echo "you have printed 20201310"
    else
       echo "you haven't printed 20201310"
       
fi

《Unix/Linux系统编程》第三周学习笔记

for 语句
for VARIABLE in stringl string2 .... stringn
  do
    commands
  done
#! /bin/bash
for ANS in 20201310 20201311
    do 
    	if [ "$ANS" -eq "20201310" ]; then
            echo hello20201310
        elif [ "$ANS" -eq "20201311" ]; then
            echo hello20201311
        fi
    done

《Unix/Linux系统编程》第三周学习笔记

while 语句
while [ condition ]
  do
    commands
  done
#! /bin/bash
i=20201310
while [ $i != 20201315 ]
    do
        echo $i
        i=$(expr $i + 1)
    done

《Unix/Linux系统编程》第三周学习笔记

until-do 语句
until [ $ANS = "give upn ]
  do
    echo -n "enter your answer :"
  read ANS
    done
#! /bin/bash
i=20201301
until [ $i = 20201310 ]
    do
        echo "$i is best"
        i=$(expr $i + 1)
    done

《Unix/Linux系统编程》第三周学习笔记

case 语句
case $variable in
  patternl) commands;; # note the double semicolons ;;
  pattern2) command;; 
  patternN) command;;
esac
#! /bin/bash
read i
echo $i
case $i in
    20201310)  echo you live in 415;;
    20201303)  echo you live in 415;;
    20201327)  echo you live in 415;;
    20201319)  echo you live in 415;;
esac

《Unix/Linux系统编程》第三周学习笔记

continue和break 语句
  • 与C语言一样
  • continue:重启最近循环的下一个迭代。
  • break:退出循环。

i/o重定向

>file //stdout转向文件,如果文件不存在,将会创建文件。
>>file //stdout追加到文件。
<file //将文件用作stdin;文件必须存在并具有r权限。
<<word //从”here”文件中获取输入,直到只包含“word”的行。

嵌入文档

  • 以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字。
#! /bin/bash
echo << A
A
cat << DONE
DONE

sh 函数

#! /bin/bash
TestFile()
{
    if [ "$1" -eq "20201310" ]; then
        echo "$1 is best"
    fi
}       
for i in 20201310 20201315 20201320 20201325
    do 
        TestFile $i
    done

《Unix/Linux系统编程》第三周学习笔记

sh 中的通配符

file*:列出当前目录中所有文件的信息。
Is *.c:列出当前目录中所有以.c结尾的文件。
[]通配符:查询某文件名中的字符
file ???:有3个字符的所有文件名。
Is*.??: 一个点号.后有2个字符的所有文件名。
[]通配符:查询文件名中一对[]中的字符。

命令分组

  • 在Sh脚本中,可以用{}或。对命令进行分组。
    (ls;mkdir abc;ls;}:通过当前sh执行{}中的命令列表。{}命令分组的唯一用处是在相 同环境下执行这些命令,例如,为分组中的所有命令重定向1/0。
  • 更有用的命令分组是(),由subsh (进程)执行。
    (cd newdir;ls;A=value;mkdir SA):通过subsh进程执行()中的命令。subsh进程可在不 影响父sh的情况下更改其工作目录。此外,当subsh进程终止时,subsh中的任何赋值变量 都不起作用。

eval 语句(不太理解)

调试sh

《Unix/Linux系统编程》第三周学习笔记

问题:

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/289939.html

(0)
上一篇 2022年9月17日
下一篇 2022年9月17日

相关推荐

发表回复

登录后才能评论