设为首页 收藏本站
查看: 772|回复: 0

shell程序设计(一)

[复制链接]

尚未签到

发表于 2015-10-25 14:41:37 | 显示全部楼层 |阅读模式
  2.4 管道和重定向
2.4.1 重定向
文件描述符    重定向       描述
     0           <         标准输入
     1           >         标准输入
     2           >         标准错误输出
                 >>        追加
                2>&1       标准输出和错误输出到同一个文件中
特别的,可以用/dev/null来有效的丢弃所有的输出信息
 ..... >/dev/null 2>&1

显示命令 > 文件
more/less < 文件

2.4.2 管道:连接进程,使得连接的进程可以同时运行

ps -xo comm|sort|uniq|grep -v sh|more
“|”后面的输入是其前面的输出
使得数据流在他们之间可以自动的进行协调。
$ cat mydate.c
dfdfkj
afljir
clkjfoi

$cat mydate.c |sort
afljir
clkjfoi
dfdfkj
可见sort不仅可以给目录呀,文件呀排序,还可以在在一个文件内给行排序,但是不能够在行内排序

$ cat mydate.c |sort|>mydate.c
显示的是空白,原因是你在读取mydate.c之前就已经覆盖了这个文件的内容,因此不能在管道中出现
输出的文件是在这一组命令被船舰的同时立刻被创建活写入。

2.5 shell
shell 脚本有两种方式:输入一系列命令让shell交互执行,如上;将命令保存到一个文件中,将该文件作为一个程序来调用

通配符
*                   任意字符串
?                   单个字符串
[abc...]        匹配方括号内任意一个单字符
[^abc..]        匹配除了方括号内任意一个单字符
{ab,dcd,...}   允许任意的字符串分组在一个集合中
如 my{ma,fa}se  值得就是 mymase myfase

2.5.1 交互式程序
直接在shell中输入命令,不过没法保存,没有重用性


2.5.2脚本
1 创建

# :注释符
#!/bin/sh :告诉系统后面的参数/bin/sh是用来执行本文件的程序
exit:确保程序返回一个有意义的退出码,当从另一个脚本程序里调用这个脚本并查看是否执行成功,退出码就很重要。
$ file first :用于检查文件类型
first: POSIX shell script text executable

2.5.3 执行
a. /bin/sh 脚本名
b. chmod +x 脚本名
    脚本名
    或者是 ./脚本名 把脚本程序的完整的相对路径且能够保证不会意外执行系统中于你的脚本文件通明的另一个命令。
如果此时告诉你没有找到该命令,是因为shell的PATH中没有被设置为当前目录下查找执行的命令。
方法一:在命令行上 PATH=¥PATH:.
方法二:将 脚本名 添加到 .bash_profile中,退出后重新登录


3.6 SHELL 语法

2.6.1 变量
使用变量前不需要声明。默认以字符串看待和存储的。
在变量名前加 $ 访问起内容。但为其赋值时,只需要变量名

1 使用引号
ke=ma ld
ld: no input files
对于有空格的必须用引号
$ke=&quot;ma  ld&quot;
$ echo $ke
ma ld
  
$ read ke       等待输入
dkf klfdj kle   输入
$ echo $ke
dkf klfdj kle   原文输出

#!/bin/sh
myvar=&quot;Hi there&quot;
echo $myvar                                // Hi there
echo &quot;$myvar&quot;                              // Hi there
echo &quot;myvar&quot;                               // myvar
echo '$myvar'                              // $myvar
echo 'myvar'                               // myvar
echo /$myvar                               // $myvar
echo /myvar                                // myvar
echo Enter some text                       // Enter some text
read myvar                                 // 等待输入
                                                         //  输入 HOW DO YOU DO
echo '$myvar' now equals $myvar            // $myvar now equals HOW DO YOU DO
exit 0

从上面的实验可以知道:
1 对于变量的引用 使用 “”和不使用是一样的
2 在“”中没有 $ 的变量 只是字符串而已
3 ‘’的作用就是输出其中的字符串
4 / 的作用和 ‘’相同

2 环境变量
$HOME     当前用户的主目录
$PATH     以冒号分割的用来搜索命令的目录列表
$PS1      命令提示符
$IFS      输入域分割符,空格、TAB,ENTER
$0        shell脚本的名字
$#           传递给脚本的参数个数
$$        shell脚本的进程号

3 参数变量

$1,$2,...        脚本程序的参数
$*               在一个变量中列出所有的参数,参数间用IFS中的第一个字符分割开
$@               与 $*意同,不使用IFS

$ IFS=''
$ set foo bar bam
$ echo $@
foo bar bam
$ echo &quot;$@&quot;
foo bar bam
$ echo $*
foo bar bam
$ echo &quot;$*&quot;
foobarbam


$ unset IFS
$ echo $IFS

$ echo &quot;$*&quot;
foo bar bam

如果想访问脚本程序的参数,用 $@ 最好


sa=&quot;Hello&quot;                                  //
echo $sa                                    //Hello
echo &quot;The program $0 is now running&quot;        // biangliang    shell脚本的名字   
echo &quot;The second parameter was $2&quot;          // bar
echo &quot;The first parameter was $1&quot;           // foo
echo &quot;The parameter list was $*&quot;            //foo bar baz
echo &quot;The script is now complete&quot;

$ /bin/sh bianliang foo bar baz

2.6.2 条件
shell脚本对任何从命令行上被调用的命令的退出码进行测试。
test / [ 布尔判断命令 且&quot; [&quot;用“]”来结尾


if [ -f /bin/bash ]    //注意保持距离
then
echo &quot;file /bin/bash exists&quot;
fi

if [ -d /bin/bash ]
then
echo &quot;/bin/bash is a directory&quot;
else
echo &quot;/bin/bash is NOT a directory&quot;
fi

执行结果为:
$ /bin/sh panduan
file /bin/bash exists
/bin/bash is NOT a directory

2.6.3 控制结构

echo &quot;Please answer yes or no : Is it morning?&quot;  //shell用echo -e,bash用echo -n来去除换行符
read timeofday

if [ $timeofday = &quot;yes&quot; ]          //一定要保持距离  if[ $timeofday 不行 ; if [ $timeofday=&quot;yes&quot;也不行
then
echo &quot;Good morning&quot;
elif [ $timeofday = &quot;no&quot; ]    //[ 对timeofday的内容进行测试,测试结果由if判断
then
echo &quot;Good afternoon&quot;
else
echo &quot;Sorry,$timeofday is not recognized.Enter yes or no!&quot;
exit 1
fi
exit 0

看似完美的程序,其实隐患重重,在不输入任何数据,直接ENTER后
[: 15: yes: unexpected operator
[: 15: no: unexpected operator
Sorry, is not recognized.Enter yes or no!
问题出在 当直接ENTER后,$timeofday 成为 空字符串
因此将 $timeofday 改为&quot;$timeofday&quot;

4 for 语句
for 循环经常与shell的文件名扩展一起使用
for variable in values_table
do
...$variable
done

for 循环经常与shell的文件名扩展一起使用
for file in *.sh

还有就是
for foo in 10
echo &quot;here wo go&quot;
这样能执行一次
for foo in 1 2 3 4 5 6 7 8 9 10
echo &quot;here wo go&quot;
却可以执行10次

for foo in 1 2 3 5 8 9 41 10 1 0
echo &quot;here wo go&quot;
依然是执行10次
  
  参考:Linux 程序设计(v3)
             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130673-1-1.html 上篇帖子: 使用Bash编写Linux Shell脚本-4.脚本初探 下篇帖子: Linux中的shell编程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表