shell基础语法

来源:互联网 发布:2016年电子商务数据 编辑:程序博客网 时间:2024/05/30 20:07
shell基础语法基础:#!/bin/sh    必须以这个开头echo "Hello World !"执行脚本chmod +x ./test.sh  #使脚本具有执行权限./test.sh  #执行脚本或者  (解释器脚本)/bin/sh test.sh/bin/php test.php就是如何简单粗暴变量:your_name="runoob.com"    变量之间不能有空格    命名规则跟其他语言大体类似your_name="qinjx"echo $your_nameecho ${your_name}    使用变量    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:for skill in Ada Coffe Action Java; do    echo "I am good at ${skill}Script"donefor file in `ls /etc`    以上语句将 /etc 下目录的文件名循环出来。只读变量#!/bin/bashmyUrl="http://www.w3cschool.cc"readonly myUrlmyUrl="http://www.runoob.com"执行脚本会报错 /bin/sh: NAME: This variable is read only.删除变量unset variable_name单引号字串中不能出现单引号(对单引号使用转义符后也不行)。字符串拼接your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1截取字符串string="runoob is a great site"echo ${string:1:4} # 输出 unoo查找字符串string="runoob is a great company"echo `expr index "$string" is`  # 输出 8   注意:注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦。数组:array_name=(value0 value1 value2 value3)array_name=(value0value1value2value3)array_name[0]=value0array_name[1]=value1array_name[n]=valuen输出数组所有元素echo ${array_name[@]}获取数组长度和数组单元长度# 取得数组元素的个数length=${#array_name[@]}# 或者length=${#array_name[*]}# 取得数组单个元素的长度lengthn=${#array_name[n]}注释以"#"开头的行就是注释,会被解释器忽略。第二章节脚本 传递参数echo "Shell 传递参数实例!";echo "执行的文件名:$0";echo "第一个参数为:$1";echo "第二个参数为:$2";echo "第三个参数为:$3";$ chmod +x test.sh $ ./test.sh 1 2 3参数处理    说明$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数。$$    脚本运行的当前进程ID号$! 后台运行的最后一个进程的ID号$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。$- 显示Shell使用的当前选项,与set命令功能相同。$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。$* 与 $a 区别:相同点:都是引用所有参数。不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 123,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。#!/bin/bash# author:菜鸟教程# url:www.runoob.comecho "-- \$* 演示 ---"for i in "$*"; do    echo $idoneecho "-- \$@ 演示 ---"for i in "$@"; do    echo $idone执行脚本,输出结果如下所示:$ chmod +x test.sh $ ./test.sh 1 2 3-- $* 演示 ---1 2 3-- $@ 演示 ---123============算数运算符号==================val=`expr 2 + 2`echo "两数之和为 : $val"注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。-eq 检测两个数是否相等,相等返回 true。    [ $a -eq $b ] 返回 false-ne 检测两个数是否相等,不相等返回 true。   [ $a -ne $b ] 返回 true-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。-ge 检测左边的数是否大等于右边的,如果是,则返回 true。    [ $a -ge $b ] 返回 false。-le 检测左边的数是否小于等于右边的,如果是,则返回 true。   [ $a -le $b ] 返回 true。a=10b=20if [ $a -eq $b ]then   echo "$a -eq $b : a 等于 b"else   echo "$a -eq $b: a 不等于 b"fi==============布尔=====================a=10b=20if [ $a != $b ]then   echo "$a != $b : a 不等于 b"else   echo "$a != $b: a 等于 b"fi==========逻辑运算符==================a=10b=20if [[ $a -lt 100 && $b -gt 100 ]]then   echo "返回 true"else   echo "返回 false"fiif [[ $a -lt 100 || $b -gt 100 ]]then   echo "返回 true"else   echo "返回 false"fiecho使用echo "\"It is a test\""    输出结果"It is a test"read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量#!/bin/shread name echo "$name It is a test"[root@www ~]# sh test.shOK                     #标准输入  用户输入OK It is a test        #输出结果echo -e "OK! \n" # -e 开启转义echo "It it a test"echo -e "OK! \c" # -e 开启转义 \c 不换行echo "It is a test" > myfileecho `date`    系统变量sprintf  %s %c %d %f都是格式替代符%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中.2指保留2位小数。printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 Test命令文件测试参数  说明-e 文件名  如果文件存在则为真-r 文件名  如果文件存在且可读则为真-w 文件名  如果文件存在且可写则为真-x 文件名  如果文件存在且可执行则为真-s 文件名  如果文件存在且至少有一个字符则为真-d 文件名  如果文件存在且为目录则为真-f 文件名  如果文件存在且为普通文件则为真-c 文件名  如果文件存在且为字符型特殊文件则为真-b 文件名  如果文件存在且为块特殊文件则为真cd /binif test -e ./bashthen    echo '文件已存在!'else    echo '文件不存在!'fi流程控制if conditionthen    command1     command2    ...    commandN fi或者if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fifor循环for var in item1 item2 ... itemNdo    command1    command2    ...    commandNdone while  语法#!/bin/shint=1while(( $int<=5 ))do        echo $int        let "int++"echo '按下 <CTRL-D> 退出'echo -n '输入你最喜欢的电影名: 'while read FILMdo    echo "是的!$FILM 是一部好电影"done运行脚本,输出类似下面:按下 <CTRL-D> 退出输入你最喜欢的电影名: w3cschool菜鸟教程是的!w3cschool菜鸟教程 是一部好电影无限循环无限循环语法格式:while :do    commanddone死循环while :do    commanddone或者for (( ; ; ))case分支echo '输入 1 到 4 之间的数字:'echo '你输入的数字为:'read aNumcase $aNum in    1)  echo '你选择了 1'    ;;    2)  echo '你选择了 2'    ;;    3)  echo '你选择了 3'    ;;    4)  echo '你选择了 4'    ;;    *)  echo '你没有输入 1 到 4 之间的数字'    ;;esacbreak跳出while :do    echo -n "输入 1 到 5 之间的数字:"    read aNum    case $aNum in        1|2|3|4|5) echo "你输入的数字为 $aNum!"        ;;        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"            break        ;;    esac自定义函数demoFun(){    echo "这是我的第一个 shell 函数!"}echo "-----函数开始执行-----"demoFunecho "-----函数执行完毕-----"使用函数: doneFun#!/bin/bash# author:菜鸟教程# url:www.runoob.comfunWithReturn(){    echo "这个函数会对输入的两个数字进行相加运算..."    echo "输入第一个数字: "    read aNum    echo "输入第二个数字: "    read anotherNum    echo "两个数字分别为 $aNum$anotherNum !"    return $(($aNum+$anotherNum))}funWithReturnecho "输入的两个数字之和为 $? !"funWithReturn函数带参数funWithParam(){    echo "第一个参数为 $1 !"    echo "第二个参数为 $2 !"    echo "第十个参数为 $10 !"    echo "第十个参数为 ${10} !"    echo "第十一个参数为 ${11} !"    echo "参数总数有 $# 个!"    echo "作为一个字符串输出所有参数 $* !"}funWithParam 1 2 3 4 5 6 7 8 9 34 73重定向$ command >> file 2>&1    多个文件特俗定界符command << delimiter    documentdelimiterdone$ wc -l << EOF    欢迎来到    菜鸟教程    www.runoob.comEOF3          # 输出结果为 3 行$文件包含#!/bin/bash# author:菜鸟教程# url:www.runoob.comurl="http://www.runoob.com"test2.sh 代码如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.com#使用 . 号来引用test1.sh 文件. ./test1.sh# 或者使用以下包含文件代码# source ./test1.shecho "菜鸟教程官网地址:$url"接下来,我们为 test2.sh 添加可执行权限并执行:$ chmod +x test2.sh $ ./test2.sh 
0 0
原创粉丝点击