Shell脚本语法2
来源:互联网 发布:c语言写个三角形 编辑:程序博客网 时间:2024/05/24 01:30
break和continue
break[n]可以指定跳出几层循环,continue跳过本次循环步,没跳出整个循环。
break跳出,continue跳过。
习题
1、把上面验证密码的程序修改一下,如果用户输错五次密码就报错退出。
位置参数和特殊变量
有很多特殊变量是被Shell自动赋值的,我们已经遇到了$?和$1,现在总结一下:
常用的位置参数和特殊变量
$0 相当于C语言main函数的argv[0]$1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。$* 表示参数列表"$1" "$2" ...,同上$? 上一条命令的Exit Status$$ 当前进程号
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。例如:
#! /bin/sh echo "The program $0 is now running" echo "The first parameter is $1" echo "The second parameter is $2" echo "The parameter list is $@" shift echo "The first parameter is $1" echo "The second parameter is $2" echo "The parameter list is $@"
shell输入输出
echo
echo显示文本行或变量,或者把字符串输入到文件。
echo [option] string-e 解析转义字符-n 不回车换行。默认情况echo回显的内容后面跟一个回车换行。echo "hello\n\n"echo -e "hello\n\n"echo "hello"echo -n "hello"
管道|
可以通过管道把一个命令的输出传递给另一个命令做输入。管道用竖线表示。
cat myfile | morels -l | grep "myfile"df -k | awk '{print $1}' | grep -v "文件系统"df -k 查看磁盘空间,找到第一列,去除“文件系统”,并输出
tee
tee命令把结果输出到标准输出,另一个副本输出到相应文件。
df -k | awk '{print $1}' | grep -v "文件系统" | tee a.txttee -a a.txt表示追加操作。df -k | awk '{print $1}' | grep -v "文件系统" | tee -a a.txt
文件重定向
cmd > file 把标准输出重定向到新文件中cmd >> file 追加cmd > file 2>&1 标准出错也重定向到1所指向的file里cmd >> file 2>&1cmd < file1 > file2 输入输出都定向到文件里cmd < &fd 把文件描述符fd作为标准输入cmd > &fd 把文件描述符fd作为标准输出cmd < &- 关闭标准输入
函数
和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表。例如:
#! /bin/sh foo(){ echo "Function foo is called";} echo "-=start=-" foo echo "-=end=-"
注意函数体的左花括号'{'和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号'}'写在同一行,命令末尾必须有;号。
在定义foo()函数时并不执行函数体中的命令,就像定义变量一样,只是给foo这个名字一个定义,到后面调用foo函数的时候(注意Shell中的函数调用不写括号)才执行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义都写在脚本的前面,把函数调用和其它命令写在脚本的最后(类似C语言中的main函数,这才是整个脚本实际开始执行命令的地方)。
Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。
下面这个脚本可以一次创建多个目录,各目录名通过命令行参数传入,脚本逐个测试各目录是否存在,如果目录不存在,首先打印信息然后试着创建该目录。
#! /bin/sh is_directory() { DIR_NAME=$1 if [ ! -d $DIR_NAME ]; then return 1 else return 0 fi } for DIR in "$@"; do if is_directory "$DIR" then : else echo "$DIR doesn't exist. Creating it now..." mkdir $DIR > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Cannot create directory $DIR" exit 1 fi fi done
注意is_directory()返回0表示真返回1表示假。
Shell脚本的调试方法
Shell提供了一些用于调试脚本的选项,如下所示:
-n
读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v
一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x
提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
使用这些选项有三种方法,一是在命令行提供参数
$ sh -x ./script.sh
二是在脚本开头提供参数
#! /bin/sh -x
第三种方法是在脚本中用set命令启用或禁用参数
#! /bin/sh if [ -z "$1" ]; then set -x echo "ERROR: Insufficient Args." exit 1 set +x fi
set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。
- Shell脚本语法2
- Shell脚本语法
- Shell脚本语法
- Shell脚本语法
- Shell脚本语法
- shell脚本语法
- windows Shell 脚本语法
- shell脚本语法
- Shell脚本语法-摘录
- Shell脚本语法
- shell脚本语法
- Shell脚本语法
- shell脚本基础语法
- Shell bash 脚本语法
- shell脚本语法
- shell 脚本基本语法
- Shell脚本语法
- Shell脚本语法
- 4用于cifar10的卷积神经网络-4.2/4.3cifar10卷积神经网络的计算图设计(上下)
- Spring Boot事务配置
- 提高MySQL性能的7个技巧
- vue.js之slot
- 第一章:Eclipse用Maven搭建SSM框架并部署到Tomcat7
- Shell脚本语法2
- CEPH集群MON全部挂掉后恢复方法
- AIME数学竞赛信息大全
- vc++窗口的创建过程(MFC消息机制的经典文章)
- Maven生命周期详解及常用命令
- 《计算机操作系统》总结十(文件管理)
- 怎样减少 Android 应用包 60% 的大小?
- 【游戏特效】划水初试(篝火&&大刀粒子装饰
- pycharm常用快捷键及设置