shell脚本学习手册

root权限 基带字库备份神器.apk 支持整个手机所有分区备份 保护大家的基带 有备份 免受张豪格机侵害 root权限 基带字库备份神器.apk 支持整个手机所有分区备份 保护大家的基带 有备份 免受张豪格机侵害 立即下载

简介:

Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。

Shell教程入门

1、shell脚本

shell脚本shell script,是一种为shell而编写的脚本程序。然而通常所说的shell却是指shell脚本,而非shell本身。

Linux系统shell种类众多,常用的有sh和bash。

2、shell脚本实践

shell脚本用#!/bin/bash或#!/bin/sh之类的方式,制定运行脚本的shell,#!是识别符号。

  1. #!/bin/sh
  2. echo "Hello World"

运行shell脚本的两种方法:

  • 作为可执行程序

将shell文本保存为.sh格式文件,赋予执行权限

    1. chmod + x ./test.sh # 赋予可执行权限
    2. ./test.sh #执行脚本,注意此处需要指明当前目录下的test.sh哦,不然会去path路径找的,呵呵。
  • 作为解释其参数

直接解释运行,如此就不用写#!/bin/sh之类的引用注释了。

    1. /bin/sh test.sh
    2.  
    3. # 类似java、php、python脚本
    4.  
    5. /bin/php test.php

Shell变量

变量命名语法,不需要$符号,php需要。命名要求:

  • 首字母必须字母a-z或A-Z
  • 不能空格,可用_
  • 不能标点
  • 不能使用bash关键字
  1. #注意,不同于其他编程语言,等号之间不要有空格。
  2. your_variable="your,name"
  1. # 使用语句给变量赋值,如下循环显示出/etc目录下的文件名
  2. for file in 'ls /etc'

1、使用变量

使用已定义变量,只需在变量前加$符号即可:

  1. your_variable='yourname'
  2. echo $your_variable
  3. echo $(your_variable)

变量名可以加{}来标识变量名的范围,如:

  1. for skill in Ada Coffe Action Java; do
  2.     echo "I am good at ${skill}Script"
  3. done

如果不加{},skill就可能被认为skillScript而导致变量找不到

已定义的变量可重新定义:

  1. your_name="tom"
  2. echo $your_name
  3. your_name="john"
  4. echo $your_name

2、只读变量

使用readonly命令将变量只读,则不可再改变,否则报错。

  1. #!/bin/bash
  2. myUrl="http://www.w3cschool.cc"
  3. readonly myUrl
  4. myUrl="new url" #此处就会报错,因为变量只读了。

3、删除变量

使用unset命令删除变量:

unset variable_name

==删除变量后不能再用,而unset不能删除只读变量==

  1. #!/bin/sh
  2. myUrl="http://www.google.com"
  3. unset myUrl
  4. echo $myUrl #此时输出就没接过了,因为变量被删除了。

4、变量类型

运行shell时,会同时存在三种变量:

  • 局部变量:脚本中定义的变量,仅作用于本shell脚本内。
  • 环境变量:所有程序,包括shell启动程序都能访问的环境变量。
  • shell变量:shell程序的特殊变量。

5、shell字符串

shell常用number和string,其中string可以单引号、双引号或者不用引号。但是略有区别:

  • 单引号

str='string test'

单引号''之间的字符原样输出,里面的变量也会失效。其内部不能再有单引号,哪怕转义符号都失效。

  • 双引号
    1. your_name='your name'
    2. str="Hello ,world ,\"$your_name\"! \n"

双引号里面可以有变量,可以有转义符号。

  • 字符串拼接
    1. n1="abc"
    2. test="hello, "$n1" !"
    3. test1="hello, ${n1} !"
    4. echo $test $test1
  • 获取字符串长度

使用#标识变量长度

    1. str="abcdef"
    2.  
    3. #输出字符串长度
    4.  
    5. echo ${#str} 
  • 获取子字符串
    1. str="abcdef"
    2.  
    3. #下标从左至右,0开始,
    4.  
    5. echo ${str:1:4}
  • 查找子字符串

使用`符号

    1. str="hello world nihaome"
    2.  
    3. #查找字符i或s的位置,反引号
    4.  
    5. echo `expr index "$str" is`

6、Shell数组

bash仅支持一维数组,可利用下标或表达式操作元素。

  • 定义数组

shell中使用()表示数组,元素用空格来分割。

    1. array=(1 2 3 4 5 6 7)
    2.  
    3. #或者
    4.  
    5. array=(
    6. a
    7. b
    8. c
    9. )
    10.  
    11. #也可以单独定义,下标可以不连续,也无范围限制。
    12.  
    13. array[0]=1
    14. array[1]=2
    15. array[3]=7
  • 读取数组
    1. variable=${array[index]}
    2.  
    3. # @符号代替index表示获取所有元素
    4.  
    5. echo ${variable[@]}
  • 获取数组长度

类似字符串的获取

    1.  
    2. #获取元素个数
    3.  
    4. length=${#array_name[@]}
    5.  
    6. #或者*通配符
    7.  
    8. length=${#array_name[*]}
    9.  
    10. #获取数组单个元素的长度
    11.  
    12. length_n=${#array_name[n]}

7、Shell注释

使用#至于行首,表示该行注释,shell无多行注释,只能每行都#

  1. #-----------------------
  2. #我是个多行注释
  3. #但是只能这么写
  4. #-----------------------

要是多行代码需要注释,可以将定义为函数,加{}包裹起来,该函数不被调用,则类似于注释掉。

Shell传递参数

在执行shell脚本时,可以向脚本传递参数,脚本内获取参数的格式:$n,n代表数字编号,为脚本内需要获取的参数的编号。

1、实例

示例向脚本传递三个参数,并输出,$0为执行文件名:

  1. #!/bin/bash
  2. #传参测试
  3.  
  4. echo "Shell 传参测试";
  5. echo "file name: $0";
  6. echo "first variable: $1";
  7. echo "second variable: $2"
  8. echo "third variable: $3";

通过赋予权限,或者指定执行,可实现输出:

  1. $ chmod +x test.sh
  2. # $符号在次表示root用户执行,下面是传入1,2,3,三个数到脚本
  3. $ ./test.sh 1 2 3 
  4.  
  5. #输出结果:
  6. Shell 传参测试
  7. file name: ./test.sh
  8. first variable: 1
  9. second variable 2
  10. third variable 3

另有几个特殊字符处理参数:

参数处理

说明

$#

传递到脚本的参数的个数

$*

以一个单字符串显示所有向脚本传递的参数。

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

类似$*,使用时许加引号,并在引号中返回每个参数。

$-

显示shell使用的当前选选项,类似set命令

$?

显示最后命令的退出状态。0 表示无错误。其他都是错。

  1. #!/bin/sh
  2.  
  3. echo "Shell 传递参数实例!";
  4. echo "第一个参数为:$1";
  5.  
  6. echo "参数个数为:$#";
  7. echo "传递的参数作为一个字符串显示:$*";

执行效果:

  1. $ chmod +x test.sh
  2. $ ./test.sh 1 2 3
  3. Shell 传递参数实例!
  4. 第一个参数为:1
  5. 参数个数为:3
  6. 传递的参数作为一个字符串显示:1 2 3

$*与$@的异同:

  • 都是应用所有参数
  • 不同:只有在双引号中体现。假设在脚本运行时写了三个参数 1、2、3,,则 ” * ” 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
    1.  
    2. #!/bin/bash
    3.  
    4.  
    5. echo "-- \$* demo ---"
    6. for i in "$*";do
    7. echo $i
    8. done
    9.  
    10. echo "-- \$@ demo ---"
    11. for i in "$@"; do
    12. echo $i
    13. done

执行效果:

    1. $ chmod +x test.sh
    2. $ ./test.sh 1 2 3
    3. -- $* 演示 ---
    4. 1 2 3
    5. -- $@ 演示 ---
    6. 1
    7. 2
    8. 3

Shell数组

Bash shell仅支持一维数组,不限定大小,初始化时候不需要指定大小。下标0开始,()包裹,空格分割元素。

array=(a b c d)

  • 读取数组

格式${array[index]}

  1. #!/bin/bash
  2. my_array=(a b "c" d)
  3.  
  4. echo "first: ${my_array[0]}"
  5.  
  6. #然后执行文件,获得输出结果
  7. #可用@或*来代替index获取所有元素
  • 数组长度

类似字符串的长度获取

${#array[index]}

Shell运算符

shell支持多种运算符:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生Bash不支持简单的数学运算,可以用awk和expr实现。

  1. #!/bin/sh
  2.  
  3. val=`expr 2 + 2`
  4. echo $val
  5.  
  6. #注意,expr用反引号,表达式和运算符之间必须有空格,2+2就不行。

1、算术运算符

若a = 10,b = 20

运算符

说明

举例

+

加号

`expr $a + $b`,result = 30

-

减号

`expr $a - $b`,result = -10

*

乘号

`expr $a * $b`,result = 200

/

除号

`expr $b / $a`,result = 2

%

取余

`expr $b % $a`,result=0

=

赋值

a=$b,将b的值赋给a

==

相等,比较数字,同则true。

[$a == $b]返回false

!=

不等,比较数字,不同的true。

[$a != $b]返回true。

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. a=10
  6. b=20
  7.  
  8. val=`expr $a + $b`
  9. echo "a + b : $val"
  10.  
  11. val=`expr $a - $b`
  12. echo "a - b : $val"
  13.  
  14. val=`expr $a \* $b`
  15. echo "a * b : $val"
  16.  
  17. val=`expr $b / $a`
  18. echo "b / a : $val"
  19.  
  20. val=`expr $b % $a`
  21. echo "b % a : $val"
  22.  
  23. if [ $a == $b ]
  24. then
  25.    echo "a 等于 b"
  26. fi
  27. if [ $a != $b ]
  28. then
  29.    echo "a 不等于 b"
  30. fi

执行结果:

  1. a + b : 30
  2. a - b : -10
  3. a * b : 200
  4. b / a : 2
  5. b % a : 0
  6. a 不等于 b
  •  

注意:条件表达式必须在[]之间,且必须有空格,如[$a==$b]是错的!

*乘号需要在expr表达式内用\转义

Mac电脑的shell的expr表达式:$((表达式))所以它的乘号*不用转义

2、关系运算符

布尔类型,关系运算符仅支持数字,除非字符串的值也是数字。示例,若a = 10 ,b = 20:

运算符

说明

-eq

equal

-ne

not equal

-gt

great than

-lt

less than

-ge

great equal

-le

less equal

3、布尔运算符

运算符

说明

!

非运算,表达式为true,则返回false。

-o

或运算,一个表达式为true,则返回true。

-a

与运算,两个都true,才返回true。

4、逻辑运算符

运算符

说明

&&

逻辑and

||

逻辑 or

5、字符串运算符

运算符

说明

=

检测两字符串是否相等

!=

检测两字符串是否不等

-z

zero检测字符串长度是否为0,0则true

-n

not zero检测字符串长度是否非0。

str

检测字符串是否为空,不空则true。

6、文件测试运算符

用于检测类unix 文件的各种属性

操作符

说明

-b file

是否是块设备文件,是则true

-c file

是否是字符设备文件,是则true

-d file

是否是目录,是则true

-f file

是否是普通文件(既非目录,亦非设备文件),若是则true

-g file

是否设置了SGID位,是则true

-k file

是否设置粘着位,是则true

-p file

是否有名管道,是则true

-u file

是否设置SUID,是则true

-r file

是否可读,是则true

-w file

是否可写,是则true

-x file

是否可执行,是则true

-s file

是否为空或大小是否大于0,非空则true

-e file

是否存在,是则true

==注意shell脚本的表达式都要在[]内哦==

Shell echo命令

类似于php的echo,shell的echo用于输出字符串,格式echo string

  • 显示普通字符串
  1. echo "Hello World"
  2. #可以不带引号
  3. echo Hello World
  •  
  • 显示转义字符
    1. echo "\"It is a test\""
    2.  
    3. #输出结果
    4.  
    5. "It is a test"
    •  
  • 显示变量

read命令从标准输入中读取一行,并把输入行的每个字段指定给shell变量

    1.  
    2. #!/bin/sh
    3.  
    4. read name
    5. echo "$name It is a test"
    6.  
    7.  
    8. #运行效果:
    9.  
    10. [root@www ~]# sh test.sh
    11. OK                     #标准输入
    12. OK It is a test        #输出
    •  
  • 显示换行
    1. echo -e "Ok ! \n" # -e 开启转义
    2. echo "It is a test"
    3.  
    4. #输出结果:注意ok后面有换行
    5.  
    6. OK!
    7.  
    8. It it a tes
    •  
  • 显示不换行
    1.  
    2. #!/bin/sh
    3.  
    4. echo -e "OK! \c" # -e 开启转义 \c 不换行
    5. echo "It is a test"
    6.  
    7. #结果:
    8.  
    9. OK! It is a test
    •  
  • 显示结果定向至文件

echo "It is a test" > test.txt

    • 1
  • 原样输出字符,不转义不取变量,需要结合单引号
    1. echo '$name\"'
    2.  
    3. #输出结果
    4.  
    5. $name\"
  • 显示命令执行结果

==命令用`来包裹==

    1. echo `data`
    2.  
    3. #结果:
    4.  
    5. Thu Jul 24 10:08:46 CST 2014

Shell printf命令

类似C语言的printf()函数,shell使用printf会比echo更具有跨平台移植性。可以类似C的printf()函数使用一些复杂的表达式,printf不支持自动换行,需要借助\n

printf format-string [args...]

  • 1

示例,模拟shell输出,

  1. $ echo "hello ,shell"
  2. hello ,shell
  3. $ printf "hello ,shell \n"
  4. hello ,shell
  5. $

脚本化的printf命令使用:

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
  6. printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
  7. printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
  8. printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

执行脚本,显示结果:

  1. 姓名     性别   体重kg
  2. 郭靖     男      66.12
  3. 杨过     男      48.65
  4. 郭芙     女      47.99

%s,%c,%d,%f都是格式替换符,%-10s指一个宽度为10个字符(-表示左对齐,没有则右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中.2指保留2位小数。

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. # format-string为双引号
  6. printf "%d %s\n" 1 "abc"
  7.  
  8. # 单引号与双引号效果一样
  9. printf '%d %s\n' 1 "abc" 
  10.  
  11. # 没有引号也可以输出
  12. printf %s abcdef
  13.  
  14. # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
  15. printf %s abc def
  16.  
  17. printf "%s\n" abc def
  18.  
  19. printf "%s %s %s\n" a b c d e f g h i j
  20.  
  21. # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
  22. printf "%s and %d \n"
  • 2

Printf的转移序列

序列

说明

\a

警告字符,通常为ASCII的BEL字符

\b

后退

\c

抑制不显示输出结果中任何姐wide换行字符(只在%b格式指示控制符下的参数字符串中有效),而且任何留在参数里的字符,任何接下来的采纳书以及任何留在格式字符串中的字符,都被忽略。

\f

换页

\n

换行

\r

回车

\t

水平tab

\v

竖直tab

\\

转义后输出一个\符号

\d dd

表示1–3位的八进制字符,仅在格式字符串中有效。

\0 dd d

表示1–3位的八进制字符

Shell text命令

shell中test命令用于测试条件是否成立,可进行数字、字符和文件的条件测试

  1. #!/bin/bash
  2.  
  3. #用之前的各种运算符,测试test
  4. num1=100
  5. num2=200
  6. if test $[num1] -eq $[num2]
  7. then
  8.     echo 'true'
  9. else
  10.     echo 'false'
  11. fi

Shell 流程控制

区别于其他编程语言,shell的流程控制不可为空,如

  1. if(a>b){
  2.   System.out.println("ok");
  3. }else{
  4.   //此处不做任何事
  5. }
  •  

但是在shell中不能出现不做任何事的分支语句

1、if else

  • if语句格式
    1. if condition
    2. then
    3. command1
    4. command2
    5. ...
    6. fi # 是if的倒写

每个句子可以用;分号结束,可以写在一行好几个语句。

  • if else
    1. if condition
    2. then
    3. command1
    4. command2
    5. ...
    6. else
    7. command
    8. fi
    •  
  • if else-if else
    1. if condition1
    2. then
    3. command1
    4. elif condition2 #类似python中,else if是写作elif
    5. then
    6. command2
    7. else
    8. command
    9. fi
    • 9

2、for循环

shell的for循环格式:

  1. for var in item1 item2 ... itemN
  2. do
  3.     command1
  4.     command2
  5.     ...
  6.  
  7. done #for循环结束的标识
  8. #写成一行
  9. for var in item1 item2 ... itemN;do command1; command2;...;done;
  • 9

3、while语句

格式:

  1. while condition
  2. do
  3.     command
  4. done
  5. #示例
  6.  
  7. #!/bin/sh
  8. int=1
  9. while(( $int<=5 ))
  10. do
  11.         echo $int
  12.         let "int++" # let是个关键命令
  13. done
  • 3

可以结合read命令接收输入信息

4、无限循环

  1. while :
  2. do
  3.     command
  4. done
  5.  
  6. #或者
  7. while true
  8. do
  9.     command
  10. done
  11.  
  12. #或者
  13. for (( ; ; ))
  •  

5、until循环

shell所有的until循环类似于一个特殊的for循环,知道满足条件时候才停止。一般还是while

  1. until condition
  2. do
  3.     command
  4. done

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

6、case

类似其他语言的switch…case语句

  1. case value in
  2. mode1)
  3.     command1
  4.     ...
  5.     ;; #case的结束标志
  6. mode2)
  7.     command2
  8.     ...
  9.     ;;
  10. esac #case的反写
  •  

value只会匹配一个case,或者不匹配,则mode可用*号通配

  1. echo '输入 1 到 4 之间的数字:'
  2. echo '你输入的数字为:'
  3. read aNum
  4. case $aNum in
  5.     1)  echo '你选择了 1'
  6.     ;;
  7.     2)  echo '你选择了 2'
  8.     ;;
  9.     3)  echo '你选择了 3'
  10.     ;;
  11.     4)  echo '你选择了 4'
  12.     ;;
  13.     *)  echo '你没有输入 1 到 4 之间的数字'
  14.     ;;
  15. esac
  •  

7、跳出循环

shell也使用break和continue来跳出循环。

  • break

跳出所有循环,终止后面的执行。

    1.  
    2. #!/bin/bash
    3.  
    4. while :
    5. do
    6.   echo -n "输入 1 到 5 之间的数字:"
    7.   read aNum
    8.   case $aNum in
    9.       1|2|3|4|5) echo "你输入的数字为 $aNum!"
    10.       ;;
    11.       *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
    12.           break
    13.       ;;
    14.   esac
    15. done
  • continue

跳出本次循环,执行下一轮循环

    1.  
    2. #!/bin/bash
    3.  
    4. while :
    5. do
    6.   echo -n "输入 1 到 5 之间的数字: "
    7.   read aNum
    8.   case $aNum in
    9.       1|2|3|4|5) echo "你输入的数字为 $aNum!"
    10.       ;;
    11.       *) echo "你输入的数字不是 1 到 5 之间的!"
    12.           continue
    13.           echo "游戏结束"
    14.       ;;
    15.   esac
    16. done
    •  

8、esac

case语句区别于C语言,用esac作为结束标志,)和;;标识每个case。

Shell函数

shell可以自定义函数,然后自己调用。函数格式:

  1. #function 关键字为可选项,参数也是可选
  2. [ function ] funname [()]
  3.  
  4. {
  5.  
  6.   action;
  7.  
  8.   [return int;]
  9.  
  10. }

说明:

  1. 可以带function fun()定义,也可以fun()定义,不带参数。
  2. 参数返回,可以显示加: return 返回,若不加,则返回最后一条指令结果。
  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. demoFun(){
  6.     echo "这是我的第一个 shell 函数!"
  7. }
  8. echo "-----函数开始执行-----"
  9. demoFun
  10. echo "-----函数执行完毕-----"
  • 0

含有返回值的函数:

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. funWithReturn(){
  6.     echo "这个函数会对输入的两个数字进行相加运算..."
  7.     echo "输入第一个数字: "
  8.     read aNum
  9.     echo "输入第二个数字: "
  10.     read anotherNum
  11.     echo "两个数字分别为 $aNum 和 $anotherNum !"
  12.     return $(($aNum+$anotherNum))
  13. }
  14. funWithReturn
  15. echo "输入的两个数字之和为 $? !"
  • 5

==调用函数返回值,用$?符号==,函数必须在被调用前定义。

  • 函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 1表示第一个参数,$2表示第二个参数…

    1.  
    2. #!/bin/bash
    3.  
    4.  
    5. # author:菜鸟教程
    6.  
    7.  
    8. # url:www.runoob.com
    9.  
    10.  
    11. funWithParam(){
    12.   echo "第一个参数为 $1 !"
    13.   echo "第二个参数为 $2 !"
    14.   echo "第十个参数为 $10 !"
    15.   echo "第十个参数为 ${10} !"
    16.   echo "第十一个参数为 ${11} !"
    17.   echo "参数总数有 $# 个!"
    18.   echo "作为一个字符串输出所有参数 $* !"
    19. }
    20. funWithParam 1 2 3 4 5 6 7 8 9 34 73
    21.  
    22. #输出结果:
    23.  
    24. 第一个参数为 1 !
    25. 第二个参数为 2 !
    26. 第十个参数为 10 !
    27. 第十个参数为 34 !
    28. 第十一个参数为 73 !
    29. 参数总数有 11 个!
    30. 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
    •  

注意:$10不能获取第10个参数,因为当n>=10时候,要用$(n)来获取参数。

Shell 输入/输出重定向

类Uinx系统中,默认标准输入输出设备就是shell终端。重定向命令列表:

命令

说明

command > file

输出重定向到file

command < file

输出重定向到file

command >> file

输出追加到file

n > file

文件描述符为n的文件重定向到file

n >> file

文件描述符为n的文件追加到file

n >& m

输出文件m和n合并

n <& m

输入文件m和n合并

<< tag

开始标记tag和结束标记tag之间的内容作为输入

注意:需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

1、输出重定向

command1 > file1

  • 1

若file1存在,则被替代。可以用>>追加符号,则不替代。

2、输入重定向

command1 < file1

  • 1

command1 < infile > outfile

  • 1

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

3、重定向深入讲解

一般类unix系统命令运行会同时打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:

  1. #模拟终端
  2. $ command 2 > file

若要追加>>符号,其中2代表标准错误文件的代号。

如果希望将stdout和stderr合并后重定向到file

  1. command > file 2>&1
  2. #或者
  3. command >> file 2>&1
  4. #如果输入、输出都重定向
  5. command <file1 >file2

4、Here Document

Here Document是shell的一种特殊重定向方式,用于将输入重定向到一个交互式shell脚本或程序:

  1. command << delimiter
  2.     document
  3. delimiter

作用将delimiter之间的document作为输入传递给command

注意:结尾的delimiter前后不得有任何符号,包括tab和空格。

  1. wc -l << EOF
  2.     nihao
  3.     zhendehenhao
  4.     shime
  5.     ok
  6. EOF
  7. #输出结果,获得的EOF之间的内容的行数。
  8. 4

5、/dev/null文件

若希望执行命令不在屏幕输出,可重定向到/dev/null

command > /dev/null

  • 1

/dev/null为特殊文件,写入的内容立即不见,不可读出。

如果屏蔽stdout和stderr

command > /dev/null 2>&1

  • 1

Shell文件包含

shell也可以使用外部脚本,便于封装:

  1. . filename #注意点号(.)与文件名之间有空格
  2. 或
  3. source filename

示例:test1.sh

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. url="http://www.runoob.com"
  •  

test2.sh

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4.  
  5. #使用 . 号来引用test1.sh 文件
  6. . ./test1.sh
  7.  
  8. # 或者使用以下包含文件代码
  9. # source ./test1.sh
  10.  
  11. echo "菜鸟教程官网地址:$url"

执行时候test2.sh只需要test2.sh有执行权限即可,test1.sh不一定需要。

 

基于深度学习的道路裂缝检测识别研究(开题报告) 具体而言,将本研究提出的模型与其他先进的道路裂缝检测算法在相同的数据集上进行对比实验,通过对比实验结果,分析不同算法在准确率、召回率、F1值等指标上的优劣,以及在实际应用中的表现。通过对综述论文的学习了解,对计算机视觉、多模态相关领域的基础进行简要介绍,并在跨模态行人重识别研究领域归纳国内外研究现状和发展趋势,明确当前面临的问题和挑战,并针对当前存在的问题展开后续研究。第二,研究解决该问题的途径和方法。基于深度学习的道路裂缝检测识别研究,旨在通过构建和优化深度学习模型,实现对道路裂缝的自动识别和定位。 阅读详情

相关推荐

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1904

能写SH文件的找我,需要写一个该机文件

修改手机机型 串码,清楚历史数据的。

2401_88933401的博客 1098

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

Shell脚本学习笔记

Shell学习笔记Shell学习笔记 简介 Shell教程入门 1shell脚本 2shell脚本实践 Shell变量 1使用变量 2只读变量 3删除变量 4变量类型 5shell字符串 6Shell数组 7Shell注释 Shell传递参数 1实例 Shell数组 Shell运算符 1算术运算符 2关系运算符 3布尔运算符 4逻辑运算符 5字符串运算符 6文件测试运算符 Shell echo命令

冰路梦 4592

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

jacke121的专栏 626

保姆级教程:一步步创建 ABAP Text Table

有朋友反馈,问有没有一个自己动手创建 Text Table 的例子,因为自己没有动手实践过,总觉得心里不踏实。这个行为的语义是,ZAI_TYPE_T 这张表的 AI_TYPE 字段值,不能随便维护,必须是表。然后另一个需要添加的字段是 AI_TYPE 这个字段值对应的文本值,本例笔者采用 SAP 标准的。也是自己创建的,很简单的一个 Data Element,类型为 CHAR,长度为 2.依次给主表的 01,02,03 三个字段值维护对应的描述信息,最后效果如下。按照下面的字段结构,创建另一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4274

linux bash命令失效,linux – Bash printf%q无效指令

printf命令内置于bash中.它也是一个外部命令,通常安装在/usr/bin/printf中.在大多数Linux系统上,/usr/bin/printf是GNU coreutils实现.较早版本的GNU coreutils printf命令不支持%q格式说明符;它是在2016年10月20日发布的版本8.25中引入的. bash的内置printf命令可以 – 并且只要bash有内置的printf命...

weixin_39577908的博客 403

Codex入门24-效率倍增秘籍(终极总结:10个让你开发速度翻倍的Codex高级技巧)

专栏收官之作!经过前23篇的系统学习,你已经掌握了 Codex CLI 的核心用法。本文浓缩10个实战验证的高级技巧:管道化提示词将复杂任务拆成递进指令链,模板化 SKILL.md 打造个人技能库,Shell 别名让操作快如闪电,多模型切换省钱又高效……这不是理论课,每个技巧都配有可直接运行的代码。掌握全部10招,构建你的 AI 开发工作流闭环,让开发速度真正翻倍!

yueyeguzhuo的专栏 189

警惕 “格机软件” 格式化手机全字库..不要轻易给不明觉厉的软件给root权限

以前的玩机界中有【锁机】软件。就是你安装一个软件后他会锁住屏幕。导致你无法操作手机。屏幕出现QQ联系方式等 勒索钱财。目前刷机界中的【格机】更胜一筹,直接格式化你手机全部分区没商量

小马哥的专栏 9869

Dify使用教程3:Dify创建工作流

Dify使用教程3:Dify创建工作流 接着,我们连接下一个节点:“LLM”填入上下文变量为:result。这时候知识库就添加成功了。添加新节点:结束节点。

拥抱具身智能,昇腾Ascend C 5128

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8527

Shell 数组

Shell 数组 引用 http://www.runoob.com/linux/linux-shell-array.html https://blog.youkuaiyun.com/Jerry_1126/article/details/52027539 Shell 数组 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。 与大...

我的博客 3566

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

Linux Shell 脚本学习手册(一)

Shell 脚本允许我们以链式编程命令,并让系统将它们作为脚本事件执行,就像批处理文件一样。这本书将从 Linux 和 Bash shell 脚本的概述开始,然后迅速深入帮助你设置本地环境,然后介绍用于编写 shell 脚本的工具。接下来的一系列章节将重点帮助你了解 Linux 的内部机制以及 Bash 为用户提供的内容。很快,你将开始沿着命令行进行旅程。你现在将开始编写实际的脚本而不是命令,并将介绍脚本的实际应用。最后一系列章节将深入探讨 shell 脚本中的更高级主题。

龙哥盟 1353

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Linux系统下shell脚本语言学习手册指南

Linux shell脚本全面学习   1. Linux 脚本编写基础   1.1 语法基本介绍   1.1.1 开头   程序必须以下面的行开始(必须方在文件的第一行):   #!/bin/sh   符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。   当编辑好脚本时,如果要执行该脚本,还必须使其可执

ridxmc的博客 3472

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux Shell 脚本学习手册(五)

在本章中,我们讨论了 Bash 中的参数扩展。我们首先回顾了我们如何在本书的大部分内容中使用参数替换,以及参数替换只是 Bash 参数扩展的一小部分。我们继续向你展示如何使用参数扩展来包括变量的默认值,以防用户没有提供自己的值。这个功能还允许我们在输入缺失时向用户呈现错误消息,尽管不是最干净的方式。我们通过展示如何使用这个来确定变量值的长度来结束了参数扩展的介绍,并且我们向你展示了我们在书中已经广泛使用了这个形式的$#语法。我们在“变量操作”标题下继续描述参数扩展的功能。

龙哥盟 1580

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux Shell 脚本学习手册(二)

我们从创建和运行我们的第一个 shell 脚本开始了这一章。学习一门新的软件语言时,几乎是强制性的,我们在终端上打印了 Hello World!接着,我们解释了 shebang:脚本的第一行,它是对 Linux 系统的一条指令,告诉它在运行脚本时应该使用哪个解释器。对于 Bash 脚本,约定是文件名以.sh 结尾,带有/bin/bash的 shebang。我们解释了可以运行脚本的多种方式。在这种情况下,shebang 是不需要的,因为我们在命令行上指定了解释器。

龙哥盟 1387

Linux Shell 脚本学习手册(四)

在本章中,我们介绍了 Bash 函数。函数是可以定义一次,然后被多次调用的通用命令链。函数是可重用的,并且可以在多个脚本之间共享。引入了变量作用域。到目前为止,我们看到的变量始终是全局作用域:它们对整个脚本都是可用的。然而,引入函数后,我们遇到了局部作用域的变量。这些变量只能在函数内部访问,并且用local关键字标记。我们了解到函数可以有自己独立的参数集,可以在调用函数时作为参数传递。我们证明了这些参数实际上与传递给脚本的全局参数不同(当然,除非所有参数都通过函数传递)。

龙哥盟 910

Linux Shell 脚本学习手册(三)

本章是关于条件测试和脚本循环的。由于我们已经讨论了语句,所以在展示条件测试工具包的更高级用法之前,我们回顾了这些信息。这些高级信息包括在条件测试场景中使用正则表达式,我们在上一章中学习过,以实现更灵活的测试。我们还向您展示了如何使用elifelse if的缩写)来顺序测试多个条件。我们解释了如何嵌套多个语句以创建高级逻辑。在本章的第二部分,我们介绍了while循环。我们向您展示了如何使用它来创建一个永远运行的脚本,或者如何使用条件来在满足某些条件时停止循环。我们介绍了until关键字,它与while。

龙哥盟 1349

Shell脚本基础1—参考资料篇

磨刀不误砍柴工,在林林总总的信息浪潮中,如果能够找到适合自己的比较有参考价值的学习资料将会达到事半功倍的效果。同时将自己的总结供大家参考将会是一件更有意义的事情。由于今后的工作需,要今天算是第一天开始学习Shell脚本。在这里打算开一个Linux命令和Shell编程基础系列的博客,供大家参考,不足之处请大家多多指教。 关于shell入门学习的教程网站参考: Anthony_te...

yongwan5637的博客 260

关于shell脚本编程一些有用资源的小结

系统维护管理过程中,编写一些能减轻管理负担的shell脚本是个明智的做法,一些例程性的事务,shell脚本会比手动操作高效的多。我有时也要编写一些,总结了一些学习及参考的shell资料,实用好用为主,大家看看有没有帮助。1. 手册当你在Linux等类UNIX系统中工作时,有一个命令你是时刻都得用的,那就是man,查看手册。shell也是,手册里的资源是最快最易获得的,而且绝大...

weixin_33966365的博客 160

高级Bash脚本编程指南

有写脚本的需求,于是下了两本书,另一本《轻松学用Linux shell编程》对读者级别定位太低,适合毫无相关经验人士阅读。这本刚好,又像速查手册又有大量实例,不足之处在sed和awk介绍太少,第一遍已经看完,学到的东西已经能够优雅地完成想要的功能了。 ·

teddy99999的专栏 724

Linux Shell 学习

例如,要查找系统中占用磁盘空间最大的文件,可以先使用`du -a`命令(计算每个文件的磁盘使用量),然后通过管道将结果传递给`sort -nr`(按照数字大小降序排序)和`head -n 1`(获取第一行,即占用空间最大的文件),命令如下:`du -a / | sort -nr | head -n 1`,再将这个命令组合封装到一个Shell脚本中,进一步巩固知识。从最基本的命令开始,如`ls`、`cd`、`pwd`、`mkdir`、`rm`等。通过阅读这些脚本,学习脚本的结构、命令的组合以及变量的使用。

chinansa的博客 821

给运维工程师的Cheatsheets! 《Shell脚本速查手册》免费下!

简介:Shell 作为 Linux 中的第一语言,几乎每一个使用 Linux 的人都用到或用过 Shell,但绝大多数人都并不能掌握 Shell 编程的基本能力和技巧。2021 年,阿里云开发者学堂联手 Linux 中国开源社区,为广大的运维工程师、开发者提供了一套内容丰富、场景丰富的 Linux 入门课程,点击查看Alibaba Cloud Linux技术图谱。  本手册是为运维工程师倾心打造,旨在为运维工程师们提供一个快速、便捷的查询手册。本书以本书以普及率最高的 Bash 为基础进行撰写,具

阿里云开发者 367

python实例手册 下载地址发布

python实例手册 下载地址发布 刚刚开始整理,请期待之后版本! python实例手册下载地址: http://url.cn/FjDuWr 其他下载: LazyManage系统批量管理软件下载(shell): http://hi.baidu.com/quanzhou722/item/4ccf7e88a877eaccef083d1a shell实例手册下载地址...

Appleseses的博客 300

Linux Shell Scripting Cookbook 第三版下载仓库

Linux Shell Scripting Cookbook 第三版下载仓库 去发现同类优质开源项目:https://gitcode.com/ 欢迎使用Linux Shell Scripting Cookbook第三版下载仓库!这里为您提供了《Linux Shell脚本手册 - 第三版》的下载资源,该书将带您领略实用的真实世界脚本案例,帮助您在使用Shell时轻松应对日常任务。 本书详细介绍了Sh...

gitblog_06755的博客 387
上一篇: linux安装与常用命令
下一篇: Git基本概念与核心命令掌握
RunnerSlowly
博客等级 码龄12年 1粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值