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
的形式接收,例如,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 是一个数字,表示第几个参数。例如,第一个参数是 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 $*和$@的区别
- $* 和 $@ 不被双引号
" "
包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据 - 被双引号
" "
包含时:-
"$*"
会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。 -
"$@"
仍然将每个参数都看作一份数据,彼此之间是独立的。
-
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
网友评论