2019.06.29
工作时间:25h
工作内容:
完善并调试RNode投票以及审批接口
下周工作计划:
完成分账模型的开发
2019.06.22
工作时间:45h
工作内容:
下周工作计划:
2019.05.12
“补一个“
工作时间: 45h
工作内容:
下周工作计划:
一、小括号,圆括号()
1、单小括号 ()
①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
②命令替换。等同于cmd
,shell扫描一遍命令行,发现了
③用于初始化数组。如:array=(a b c d)
2、双小括号 (( ))
①整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。
②只要括号中的运算符、表达式符合C语言运算规则,都可用在
③单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将
④常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in seq 0 4
或者for i in {0..4}。再如可以直接使用if ((
二、中括号,方括号[]
1、单中括号 []
①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab < bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。
2、双中括号[[ ]]
①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
例子:
01.if (
02.if [ $i -lt 5 ]
03.if [
04.if [
05.if [[
06.for i in
07.for i in seq 0 4
;do echo
08.for ((i=0;i<5;i++));do echo $i;done
09.for i in {0..4};do echo $i;done
command > file
#比如
who > users
command < file
#从文件读取
#综合以上两个可以
command < file1 > file2
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
如果希望 stderr 重定向到 file,可以这样写:
command 2 > file
如果希望将stdout和stderr合并后重定向,可以这样写:
command > file 2>&1
这是特殊的一种重定向
command << tag #开始的tag前后的空格会被忽略
document
tag #tag可以是字符串、符号、EOF等 ,但是一定要顶格写,前后不能有任何字符
它会将两个tag之间的内容(document)作为输入传给command
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是
/dev/null 文件非常有用,将命令的输出重定向到它,会起到"==禁止输出=="的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
command > /dev/null 2>&1
相当于引用外部脚本
. filename
#或者
source filename
被包含的文件不需要可执行权限
比如在demo中创建两个shell脚本,其中一个脚本中给出变量num,并且在另一个脚本中使用
#!/bin/bash
#这是test1.sh
num=233333
#!/bin/bash
#这是test2.sh
. ./test2.sh
#或者
#source ./test2.sh
echo "233333,read after me"
echo $num
[ function ] funname [()]
{
action;
[return int;]
}
#1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
#2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
简单demo
demoFun(){
echo "Hello,world!"
return $((1+3)) #这个可以计算,也可以$(( n2))
}
echo "-----函数开始执行-----"
demoFun
echo "it is $?" #特殊变量中$?用于接收最后一个函数的返回
echo "-----函数执行完毕-----"
#必须在使用前定义!
通过$n来获取,和脚本从外部中断获取一样
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !" #注意当参数超过10个的时候使用10及以后的参数需要 ${n}
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
if condition
then
command1
command2
...
commandN
else
command
fi
#可以写成一行
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
#适用于终端cmd
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
#elif可以多次使用
#elif
#then
#elif
#then
#..
以上的conditihon可以使用
if [ $a -gt
或者if test $[n1] -gt
(其中n1=$[2*3];n2=
这是计算的方法)
for var in item1 item2 ... itemN #可以使用两个括号: for((assign;condition;net))与C中类似,另外
do #使用两个圆括号的时候内部变量不需要加$,下面的while同理
command1 #循环体内要使用变量的话还是要$
command2
...
commandN
done
#写成一行
for var in item1 item2 ... itemN; do command1; command2… done;
#同样,适用于终端cmd
#in列表可选,可以文件名或者字符串
#也可以使用命令
for file in $(ls /etc | grep -c "ssh")
do
cmd1
cmd2
done
while condition
do
command
done
#比如如下
int=1
while(( int<=5 )) #这里也可以使用[ $int -le 5 ],这是上面for所说的两个圆括号,内部变量可以加$也可以不加
do #并且圆括号内的空格比较随意可加可不加
echo $int
let "int++"
done
#let命令是linux中的,用于变量计算,变量计算中不用加$
#比如let n++
#let n--
#let n+=20等
#或者可以和其他的命令联合
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
until condition
do
command
done
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
#比如
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4' #还可以使用| : 1|2|3|4)
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
这两个运算符与C相同意义
echo string
#普通
echo "23333asd"
echo 23333asd
#转义
echo "\"2333\""
echo \"2333\"
#read命令:从标准输入中读取一行,并且把输入行的每个字段赋给变量
read name
echo "$name is a test"
#-e 开启转义
echo -e "2333 \n" #换行
echo -e "2333 \c" #不换行
#重定向
ehco "23333">2333.txt
#原样输出(利用'')
echo '$asd\"'
#输出$asd\"
#显示命令执行结果
echo `date`
#反引号,输出Thu Jul 24 10:12:23 CST 2019
模仿C程序库中的printf(),使用POSIX标准定义,使用printf比echo
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
输出为
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
其他实例
# format-string为双引号
printf "%d %s\n" 1 "abc"
# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc"
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,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"
转义字符与C中的相同
bash不支持运算,要使用该其他命令如awk和expr
val=`expr 2 + 2`
#注意表达式和运算符之间加空格
#注意是反引号
a=10
b=20
if [ b ]
then
echo " b : a 等于 b"
else
echo " b: a 不等于 b"
fi
if [ b ]
then
echo " b: a 不等于 b"
else
echo " b : a 等于 b"
fi
#
#也可以[ b ]
#
if [ b ]
then
echo " b: a 大于 b"
else
echo " b: a 不大于 b"
fi
if [ b ]
then
echo " b: a 小于 b"
else
echo " b: a 不小于 b"
fi
if [ b ]
then
echo " b: a 大于或等于 b"
else
echo " b: a 小于 b"
fi
if [ b ]
then
echo " b: a 小于或等于 b"
else
echo " b: a 大于 b"
fi
a=10
b=20
if [ b ] #可以使用if [ ! b ]
then
echo " b : a 不等于 b"
else
echo " b: a 等于 b"
fi
if [ b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
它们分别可以检测字符串的相等和各类属性以及文件的属性(读/写/执行/目录)
这里不赘述,需要的时候查找
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
都可以(元素之间用空格)
或者单独定义元素,下标可以不连续并且无限制
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
valuen=${array_name[n]}
#使用@可以获取所有元素
echo ${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
#这就是注释
#这样的
#------------------------------
另外如果大段代码需要注释可以将这一部分封装成函数,只要不调用就不会执行,也方便再次复用
多行注释还可以使用以下格式
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
单引号内不能引用变量
单引号内不能出现单独一个单引号(转义后也不行),可以用于拼接字符串
str='asd as d asd asd'
双引号内可以有变量
双引号内可以转义
your_name='zyx'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
your_name="zyx"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo greeting_1
# 使用单引号拼接
greeting_2='hello, ' {your_name} !'
echo greeting_3
输出
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
获取长度
str="asdc"
echo ${#str}
提取子字符串
str="asdasdasdasd"
echo ${str:1:4}
查找子字符串
str="123asdijkao"
echo `expr index "$str" io`
#反引号`
字符串中使用要加转义
\
定义时不加$,变量名:字母数字下划线(数字不能最先)
your_name="zyx"
变量和等号中间不能有空格
for file in 'ls /etc'
for file in $(ls /etc)
$变量
your_name="2333"
echo {your_name}
#花括号可选,用于区分边界:考虑$javascript和${java}script
#建议全都加{}
可以再次赋值
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
#不是${your_name}=“tom"
readonly命令
name="asdasd"
readonly name
#此时再给name赋值
#name="aaaaaa"
#会报错
unset命令
name="a"
unset name
echo $name
#删除后不能使用,但是不能删除只读变量
执行
rm -rf ~/.local/share/eosio/nodeos/
rm -rf ~/.local/share/eosio/nodeos/data
rm nodeos.log重新执行tail命令
这里第一条不需要呀朋友