shell学习笔记

Table of Contents

 

什么是shell

1.编写脚本

2.Shell变量

3.Shell字符串

引号

拼接字符串

获取字符串长度

提取子字符串

查找子字符串

4.Shell数组

5.Shell注释

6.shell传递参数

7.Shell运算符

算术运算符

关系运算符

布尔运算符

逻辑运算符

字符串运算符

文件测试运算符

8.echo命令

9.printf命令

10.test命令

11.流程控制

11.1 条件语句

11.2 循环语句

11.2.1 for循环:

11.2.2 while循环:

11.2.3 无限循环:

11.2.4 until循环

11.2.5 case语句

11.2.6跳出循环

12. shell函数

13. 输入/输出重定向

14. 文件包含

15.其他



什么是shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。


1.编写脚本

vi/vim test.sh
i
#!/bin/bash
# This is our first script .

echo 'Hello World !'

esc

:wq

加执行权限
chmod +x ./test.sh
chmod 755 ./test.sh

执行
./test.sh

添加PATH路径
echo PATH
(export PATH=~/bin:"$PATH"
. .bashrc)
mkdir bin
mv test bin
test

系统管理员使用的脚本经常放到 /usr/local/sbin 目录下。 大多数情况下,本地支持的软件,不管是脚本还是编译过的程序,都应该放到 /usr/local 目录下, 而不是在 /bin 或 /usr/bin 目录下。

长选项名称:更能提供可读性
ls -ad等价于
ls --all --directory

配置vim
:syntax on 打开语法高亮
:set hlsearch 高亮查找结果
:set tabstop=4 设置一个 tab 字符所占据的列数。默认是8列。把这个值设置为4(一种常见做法), 从而让长文本行更容易适应屏幕。
:set autoindent 让 vim 能对新的文本行缩进与刚输入的文本行相同的列数。 对于许多编程结构来说,这就加速了输入。停止缩进,输入 Ctrl-d。

 

2.Shell变量

三种变量:局部变量、环境变量、shell变量

your_name="runoob.com"

echo $your_name    #引用已定义的变量加$
echo ${your_name}  #加不加花括号都可以,但下面这种情况会err,推荐都加上

your_name="tom"    #变量可以二次赋值
echo ${your_name}  #此时会输出tom,但上一个echo还是会输出rumoob.com

for skill in Ada Coffe Java; do
    echo "I am good at ${skill}Script"
done

myUrl="http://www.w3cschool.cc"
readonly myUrl     #只读变量

unset variable_name
unset your_name    #删除变量,不能删除只读变量

 

3.Shell字符串

引号

字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号
str='this is a string'
    单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
    双引号里可以有变量
    双引号里可以出现转义字符

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

获取字符串长度

string="abcd"
echo ${#string} #输出4

提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符 "i 或 s" 的位置:
string="runoob is a great company"
echo `expr index "$string" is`  # 输出 8,注意这里是`符号,不是'"

4.Shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。 
定义数组:
数组名=(值1 值2 ... 值n)    或者:
数组名=(
值1
值2
...
值n

定义数组分量:

array_name[0]=value0

读取数组:

${array_name[n]}
使用@ 或 * 可以获取数组中的所有元素
echo ${array_name[@]}    

获取数组长度:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

5.Shell注释

sh里没有多行注释,只能每一行加一个#号。

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。 

 

6.shell传递参数

接收来自命令行传入的参数,第一个参数用$1表示,第二个参数$2表示,。。。以此类推。注意:$0表示脚本文件名。另外一个在shell编程中经常用到 的是“$@”这个代表所有的参数.eg:
#!/bin/bash
if [ $1 == "start" ]
  then   
  echo "do start"
  command groups
  elif [ $1 == "stop" ]
  then
  echo "do stop"
  command group
  else
  echo "Please make sure the positon variable is start or stop."
fi

参数处理:
$#     传递到脚本的参数个数
$*     以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$     脚本运行的当前进程ID号
$!     后台运行的最后一个进程的ID号
$@     与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
(假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。 )
$-     显示Shell使用的当前选项,与set命令功能相同。
$?     显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

 

7.Shell运算符

bash不支持简单的数学运算,可以通过其他命令实现,比如AWK和expr。
expr是一款表达式计算工具,能完成表达式的求值工作。最常用。
eg:val=`expr 2 + 2`
表达式之间必须有空格,要被``包含。
GT 就是 GREATER THAN大于  
LT 就是 LESS THAN小于 

算术运算符

+   `expr $a + $b`
-   `expr $a - $b`
\*  val=`expr $a \* $b`
/   val=`expr $b / $a`
%   val=`expr $b % $a`
=   a=$b
==
if [ $a == $b ] (注意[]里面必须空格!!!)
then
   echo "a 等于 b"
fi
!=
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

关系运算符

-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。

布尔运算符

!     非运算,表达式为 true 则返回 false,否则返回 true。     [ ! false ] 返回 true。
-o     或运算,有一个表达式为 true 则返回 true。     [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a     与运算,两个表达式都为 true 才返回 true。     [ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算符

&&     逻辑的 AND     [[ $a -lt 100 && $b -gt 100 ]] 返回 false
||     逻辑的 OR     [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串运算符

=     检测两个字符串是否相等,相等返回 true。     [ $a = $b ] 返回 false。
!=     检测两个字符串是否相等,不相等返回 true。     [ $a != $b ] 返回 true。
-z     检测字符串长度是否为0,为0返回 true。     [ -z $a ] 返回 false。
-n     检测字符串长度是否为0,不为0返回 true。     [ -n $a ] 返回 true。
str     检测字符串是否为空,不为空返回 true。     [ $a ] 返回 true。

文件测试运算符

-b file     检测文件是否是块设备文件,如果是,则返回 true。     [ -b $file ] 返回 false。
-c file     检测文件是否是字符设备文件,如果是,则返回 true。     [ -c $file ] 返回 false。
-d file     检测文件是否是目录,如果是,则返回 true。     [ -d $file ] 返回 false。
-f file     检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。     [ -f $file ] 返回 true。
-g file     检测文件是否设置了 SGID 位,如果是,则返回 true。     [ -g $file ] 返回 false。
-k file     检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。     [ -k $file ] 返回 false。
-p file     检测文件是否是有名管道,如果是,则返回 true。     [ -p $file ] 返回 false。
-u file     检测文件是否设置了 SUID 位,如果是,则返回 true。     [ -u $file ] 返回 false。
-r file     检测文件是否可读,如果是,则返回 true。     [ -r $file ] 返回 true。
-w file     检测文件是否可写,如果是,则返回 true。     [ -w $file ] 返回 true。
-x file     检测文件是否可执行,如果是,则返回 true。     [ -x $file ] 返回 true。
-s file     检测文件是否为空(文件大小是否大于0),不为空返回 true。     [ -s $file ] 返回 true。
-e file     检测文件(包括目录)是否存在,如果是,则返回 true。     [ -e $file ] 返回 true。

 

8.echo命令

echo string
or
echo "string"
or 
echo 'string'
双引号内显示转义字符:\\  \*  \" \n
单引号照原样输出,不转义
显示命令执行结果  eg:echo `date`

 

9.printf命令

printf  format-string  [arguments...]
    format-string: 为格式控制字符串
    arguments: 为参数列表。
eg:
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 

 %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j

# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n" 


abcdefabc
def
a b c
d e f
g h i
j  
 and 0

\a    警告字符,通常为ASCII的BEL字符
\b    后退
\c    抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f    换页(formfeed)
\n     换行
\r    回车(Carriage return)
\t    水平制表符
\v    垂直制表符
\\    一个字面上的反斜杠字符
\ddd     表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd    表示1到3位的八进制值字符

 

10.test命令

用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
字符串测试
文件测试

 

11.流程控制

Shell的流程控制不可为空

11.1 条件语句

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi


11.2 循环语句

11.2.1 for循环:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

11.2.2 while循环:

while condition
do
    command
done

while循环可用于读取键盘信息。按<Ctrl-D>结束循环。
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
    echo "是的!$FILM 是一部好电影"
done

11.2.3 无限循环:

while :
do
    command
done
或者:
while true
do
    command
done
或者
for (( ; ; ))

11.2.4 until循环

until循环执行一系列命令直至条件为真时停止。
until循环与while循环在处理方式上刚好相反。
一般while循环优于until循环
until condition
do
    command
done

11.2.5 case语句

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

11.2.6跳出循环

跳出所有循环break
case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
esac

跳出当前循环continue

 

12. shell函数

[ function ] funname [()]

{

    action;

    [return int;]

}
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
参数返回,可以显示加:return 返回,函数返回值在调用该函数后通过 $? 来获得。
如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255 
eg:
funWithReturn(){
    read aNum
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

函数参数:
调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 

参数处理     说明
$#     传递到脚本的参数个数
$*     以一个单字符串显示所有向脚本传递的参数
$$     脚本运行的当前进程ID号
$!     后台运行的最后一个进程的ID号
$@     与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-     显示Shell使用的当前选项,与set命令功能相同。
$?     显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

 

13. 输入/输出重定向

command > file     将输出重定向到 file。
(任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。 )
command < file      将输入重定向到 file。
command >> file  将输出以追加的方式重定向到 file。
command1 < infile > outfile    同时替换输入和输出+
/dev/null文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1

 

14. 文件包含

Shell文件可以包含外部脚本。
eg:
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh

 

15.其他

1)shell脚本远程登录服务器
http://blog.csdn.net/birdben/article/details/52166960

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值