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不一定需要。

 

手把手教你用STM32实现SPWM逆变器控制(附完整代码) 本文提供了一份基于STM32实现SPWM逆变器控制的完整实战指南。文章从硬件选型(如STM32F103C8T6、IR2104驱动器)入手,详细解析了利用定时器TIM1生成SPWM波形的核心原理与代码实现,并涵盖了驱动电路、全桥功率电路及LC滤波器的设计要点与调试技巧,旨在帮助读者从零构建一个可靠的单相全桥逆变器系统。 阅读详情

相关推荐

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 382

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

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

2401_88933401的博客 1098

Cesium中实现阴影率分析

看到群里有人在研究这个,所以看了一下。主要是模仿超图的,实现原理超图有做回答:但其实超图的这个实现方式还是过于复杂,原因是:既然是获取太阳的日照阴影,而Cesium中原本就存在太阳,且能投射阴影,因此其实并不需要再次计算太阳位置并计算视锥获取深度图,直接使用Cesium原生的太阳深度图即可。

weixin_43481439的博客 2216

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

树莓派小车:智能捡球小车——Q宝

在遇到第一个直角右转口后,进入阶段二,阶段二是智能小车减速,因为速度过快可能导致车头下方的检测出现小毛病,小车进入第一个左拐路口,增加左转时间,然后直行,到横线处,小车停止,进入阶段三,小车先识别前方的球类,然后倒车到拐口处,原地右转,之后的识别也是类似的操作,随后有一个简单的避障功能,进行球类识别测试时,在本地测试效果良好,但是投入实际应用中时,受到光线等因素的影响,识别球类的能力大大下降。小车摄像头精度不够,视角较小,在识别人脸时,需要不断移动人脸照片,让摄像头能够抓取人脸。在第一阶段的循迹过程中,

dfbsszxzv的博客 1932

rk3566-11.0新增device分区

1.增加块设备 2.修改根目录节点权限 3.开机启动自动挂载 增加块设备 1.修改parameter.txt文件,新增块设备大小及命名 device/rockchip/rk356x/rk3566_r/parameter.txt FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3566_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE

weixin_51115260的博客 3383

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

推荐系统公平性之流行度偏差(fairness in recommender systems -- popularity bias)

主要参考论文:《The Unfairness of Popularity Bias in Recommendation》 RMSE@RecSys 2019 流行度偏差是什么 先定义流行物品和非流行物品。下图是(Movielens 1M)数据集中物品的评分情况。 图的横坐标表示不同物品,纵坐标表示物品的评分次数。可以看出只有少部分物品得到了很多的评分,大部分曲线尾部的物品都只有少量的评分,我们也把这部分物品称为长尾物品。在本文中,我们取曲线的前20%对应的物品为流行物品,剩余的为非流行物品(长尾物品)。 然

beilizhang的博客 5270

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

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

小马哥的专栏 9869

(四) OpenClaw-Skill技能全面了解和自定义技能

OpenClaw Skills是提升AI代理功能性的关键模块。本文系统介绍了Skills的核心概念、获取渠道和创建方法。Skills作为标准化指令集合,能让OpenClaw从单纯理解升级为实际执行任务,相比传统System Prompt具有模块化、可复用等优势。用户可通过Clawhub官方商店、GitHub社区等渠道获取5700+现成技能,或按需开发自定义Skill。文章详细演示了创建"Hello World"示例技能的完整流程,包括编写Python脚本、配置SKILL.md文件、部署。

直到世界的尽头 8294

多物理场光学仿真软件:COMSOL_(10).激光器与谐振腔仿真

定义Nd:YAG晶体的材料属性% 折射率% 吸收系数% 发射截面% 定义光泵浦源% 泵浦光波长% 泵浦光强度% 泵浦光方向% 定义全反射镜% 选择边界% 完美电导体边界条件% 定义部分反射镜% 选择边界% 反射率边界条件% 反射率通过 COMSOL 对激光器和光学谐振腔进行仿真,可以全面评估激光器的性能,包括输出功率、效率、稳定性和模式选择等。这些仿真结果为激光器的设计和优化提供了重要的参考依据。

kkchenjj的博客 1648

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

IgH EtherCAT 从入门到精通:第 2 章 环境搭建与编译安装

环境搭建与编译安装指南 本章详细介绍了搭建IgH EtherCAT Master开发环境的完整流程。内容包括: 硬件要求:支持多种Intel和Realtek网卡的原生驱动,以及通用网卡的generic驱动选项 软件依赖:列出Linux系统下所需的工具链和开发包 源码获取:通过Git克隆官方仓库并切换稳定版本的方法 配置选项:详细解析bootstrap脚本和configure的核心参数,包括路径设置、功能开关和实时框架选项 编译流程:从生成构建系统到最终编译安装的完整步骤 通过本章指导,读者可以完成一个可运行

从事嵌入式linux android驱动开发,拥有全栈能力 476

Linux Shell 脚本学习手册(一)

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

龙哥盟 1353

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

ridxmc的博客 3472

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux Shell 脚本学习手册(五)

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

龙哥盟 1580

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、付费专栏及课程。

余额充值