美文网首页
shell 脚本语言

shell 脚本语言

作者: 南方的小巷 | 来源:发表于2020-04-22 07:21 被阅读0次

echo

echo 是一个输出命令,可以用来输出数字、变量、字符串。

[root@izwz9cyyo3i6o69tarbe2oz ~]# echo "C语言中文网"
C语言中文网
#   变量前加 $
[root@izwz9cyyo3i6o69tarbe2oz ~]# echo $JAVA_HOME
/usr/local/jdk1.7.0_60

shell 脚本

test.sh

#!/bin/bash
echo "What is your name?"
#read 命令从 stdin 获取用户输入的内容并赋值给 PERSON 变量
read PERSON  
echo "Hello, $PERSON"

#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行

echo 输出文本命令

#及其后面的内容是注释

运行脚本

$ chmod +x ./test.sh  #设置文件执行的权限
$ ./test.sh   
What is your name?
mozhiyan
Hello, mozhiyan
$

变量

#定义变量   注意: = 周围不能有空格
#已定义的变量,可以被重新赋值
variable=value
variable='value'
variable="value"
#使用变量
author="严长生"
echo $author
echo ${author}
#变量名外面的花括号{ }是可选的,加不加都行,
#加花括号是为了帮助解释器识别变量的边界
echo "I am good at ${author}Script"

单引号和双引号的区别

以单引号' '包围变量的值时,单引号里面是什么就输出什么

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令

#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
##运行结果
#C语言中文网:${url}
#C语言中文网:http://c.biancheng.net

命令的结果赋值给变量

variable=$(可执行的命令)
variable=`可执行的命令`
$ cd code
$ log=$(cat log.txt) #推荐
$ echo $log
[2018-09-10 06:53:22] 正在编写Shell教程
$ log=`cat log.txt`  #不推荐,易混淆
$ echo $log
[2018-09-10 06:53:22] 正在编写Shell教程

只读变量

#!/bin/bash
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
##结果报错
# /bin/sh: NAME: This variable is read only.

删除变量

unset variable_name
# eg :
#!/bin/sh
myUrl="http://c.biancheng.net/shell/"
unset myUrl
echo $myUrl
##结果无输出

作用域

#!/bin/bash
#定义函数
function func(){
    local a=99  #局部变量
    b = 100    #全局变量
}
#调用函数
func
#输出函数内部的变量
echo $a
echo $b
#临时的环境变量
#关闭回话就销毁
export a=100

Shell位置参数(命令行参数)

定义 Shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用$n的形式接收,例如,1 表示第一个参数,2 表示第二个参数,依次类推

1)给脚本文件传递位置参数

test.sh

#!/bin/bash
echo "Language: $1"
echo "URL: $2"

运行脚本

 . ./test.sh Shell http://c.biancheng.net/shell/
 ##输出结果
 #Language: Shell
 #URL: http://c.biancheng.net/shell/

2)给函数传递位置参数

test.sh

#!/bin/bash
#定义函数
function func(){
    echo "Language: $1"
    echo "URL: $2"
}
#调用函数
func Shell http://c.biancheng.net/shell/

运行脚本

$ . ./test.sh
 ##输出结果
 #Language: Shell
 #URL: http://c.biancheng.net/shell/

Shell特殊变量

变量 含义
$0 当前脚本的文件名。
$n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 1,第二个参数是2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。当被双引号" "包含时,@ 与* 稍有不同,我们将在《Shell *和@的区别》一节中详细讲解。
$? 上个命令的退出状态,或函数的返回值,我们将在《Shell $?》一节中详细讲解。
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

传递参数(脚本,函数传递一样)

#!/bin/bash
#定义脚本文件:test.sh
echo "Process ID: $$"
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "All parameters 1: $@"
echo "All parameters 2: $*"
echo "Total: $#"

#运行脚本
$ chmod +x ./a.sh
$ ./test.sh Shell Linux
##运行结果
#Process ID: 2788
#File Name: ./test.sh
#First Parameter : Shell
#Second Parameter : Linux
#All parameters 1: Shell Linux
#All parameters 2: Shell Linux
#Total: 2

Shell $*和$@的区别

  1. $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据
  2. 被双引号" "包含时:
    • "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
    • "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

Shell $?

获取函数返回值或者上一个命令的退出状态

Shell命令替换:将命名的输出结果赋值给变量

Shell 命令替换是指将命令的输出结果作为值赋给某个变量。比如,在某个目录中输入 ls 命令可查看当前目录中所有的文件,但如何将输出内容存入某个变量中呢?这就需要使用命令替换了,这也是 Shell 编程中使用非常频繁的功能。

被替换的命令的输出内容包括多行(也即有换行符),或者含有多个连续的空白符,那么在输出变量时应该将变量用双引号包围,否则系统会使用默认的空白符来填充,这会导致换行无效,以及连续的空白符被压缩成一个。

请看下面的代码:

#!/bin/bash
LSL=`ls -l`
echo $LSL  #不使用双引号包围
echo "--------------------------"  #输出分隔符
echo "$LSL"  #使用引号包围
#运行结果
total 8 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 35 10月 31 10:20 demo.sh~
--------------------------
total 8
drwxr-xr-x. 2 root     root      21 7月   1 2016 abc
-rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh
-rw-rw-r--. 1 mozhiyan mozhiyan  35 10月 31 10:20 demo.sh~

字符串

获取字符串长度

#!/bin/bash

str="http://c.biancheng.net/shell/"
echo ${#str}
运行结果:
29

字符串拼接

#!/bin/bash

name="Shell"
url="http://c.biancheng.net/shell/"

str1=$name$url  #中间不能有空格
str2="$name $url"  #如果被双引号包围,那么中间可以有空格
str3=$name": "$url  #中间可以出现别的字符串
str4="$name: $url"  #这样写也可以
str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号

echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
运行结果:
Shellhttp://c.biancheng.net/shell/
Shell http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
ShellScript: http://c.biancheng.net/shell/index.html

字符串截取

${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%%*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

${string: start :length} 从左边数

# 
url="c.biancheng.net"
echo ${url: 2: 9}
结果为biancheng

${string: 0-start :length}从右边数

url="c.biancheng.net"
echo ${url: 0-13: 9}
结果为biancheng。从右边数,b是第 13 个字符。
echo ${url: 0-13}  #省略 length,直接截取到字符串末尾
结果为biancheng.net

数组

#定义数组
array_name=(ele1  ele2  ele3 ... elen)
#获取数组元素
${array_name[index]}
#获取数组长度,一下两者都可以
${#array_name[@]}  
${#array_name[*]}
#删除元素
unset array_name[index]   #删除单个元素
unset array_name   #删除整个数组
#数组拼接
array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

Shell内建命令(内置命令)

由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。

使用 type 来确定一个命令是否是内建命令:

[root@localhost ~]# type cd
cd is a Shell builtin
[root@localhost ~]# type ifconfig
ifconfig is /sbin/ifconfig

alias

alias 用来给命令创建一个别名

#查看所有已创建的别名
[root@localhost ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
#创建别名
alias myShutdown='shutdown -h now'

这样定义别名只能在当前 Shell 环境中有效,换句话说,重新登录后这个别名就消失了。为了确保永远生效,可以将该别名手动写入到用户主目录中的.bashrc文件。

.bashrc其实也是一个 Shell 脚本文件,该文件专门用来存放用户自定义的别名和函数。

# .bashrc
# User specific aliases and functions
alias myShutdown='shutdown -h now'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

unalias 内建命令可以删除当前 Shell 环境中的别名

#删除 ll 别名
unalias ll
#删除所有的别名
unalias -a

echo

用来在终端输出字符串,并在最后默认加上换行符。

exit

  • 如果在终端中直接运行 exit 命令,会退出当前登录的 Shell,并关闭终端;
  • 如果在 Shell 脚本中出现 exit 命令,会停止执行后边的所有代码,立即退出 Shell 脚本。

ulimilt

使用 ulimit 命令可以控制进程对可用资源的访问

数学运算

算术运算符 说明/含义
+、- 加法(或正号)、减法(或负号)
*、/、% 乘法、除法、取余(取模)
** 幂运算
++、-- 自增和自减,可以放在变量的前面也可以放在变量的后面
!、&&、|| 逻辑非(取反)、逻辑与(and)、逻辑或(or)
<、<=、>、>= 比较符号(小于、小于等于、大于、大于等于)
==、!=、= 比较符号(相等、不相等;对于字符串,= 也可以表示相当于)
<<、>> 向左移位、向右移位
~、|、 &、^ 按位取反、按位或、按位与、按位异或
=、+=、-=、*=、/=、%= 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1

(()):对整数进行数学运算

双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。

let命令:对整数进行数学运算

let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算

[c.biancheng.net]$ a=10 b=35
[c.biancheng.net]$ let a+=6 c=a+b  #多个表达式以空格为分隔
[c.biancheng.net]$ echo $a $c
16 51
[c.biancheng.net]$ echo let a+b  #错误,echo会把 let a+b作为一个字符串输出
let a+b

相关文章

网友评论

      本文标题:shell 脚本语言

      本文链接:https://www.haomeiwen.com/subject/gxqbihtx.html