Bash知识

Bash知识

案例

a = 'a * b'
echo $a
#>>> a a a b a.log url1.txt b
echo "$a"
#>>> a * b

原理:命令行解析过程中是将变量的值直接替换到命令行中,所以echo $a执行的时候相当于执行了echo a * b,之后继续编译,将*替换成当前目录下所有非隐藏文件的文件名,发现已经没有东西可以解析之后之后再echo到屏幕

$a使用双引号进行包裹之后,命令行解析过程中就不会解析对应符号

技巧

printf

printf -v xxx "%s" "some order"
#将格式化输出定向到变量xxx中
#高效的变量赋值手段
printf '%b\n' "a\nb"
#>>>
#a
#b
printf '%s\n' "a\nb"
#a\nb

printf "%q\n" "ab'c"
#>>>ab\'c
printf "%s\n" "ab'c"
#>>>ab'c
printf "%(%T)T\n"
#>>> 16:33:12
printf "%(%F %T)T\n" #加上具体时间戳
#>>>2021-07-12 16:33:34
printf "%(%F %T)T\n" -1
#>>>2021-07-12 16:33:34
printf "%(%F %T)T\n" -2
#>>>2021-07-12 16:24:34 #shell启动时间点,统计脚本运行时间

printf "$s $s $d\n" "hello" world
#>>>hello world 0
printf "$s $s $s\n" "hello" world#使用null string 格式化
#>>>hello world
printf "$s\n" "hello" world
#>>>hello
#world #进行了重用
printf "$s %d\n" "hello" 3 world
#>>>hello 3
#world 0

printf "=%s" {1..5}
#>>>=1=2=3=4=5

printf "-%.0s" {1..100}
#>>>-bash: printf: -%: invalid option
#printf: usage....
printf -- "-%.0s" {1..100}
#>>>--------....-----

arr=(a b c d)
printf "%s," %{arr[@]}

declare

declare b
declare c=world
echo $c
#>>>world

declare -i a=333 #表达变量为一个数值
#使用了-i之后在内存中仍然保存为string,使用的时候才会解析成数值
declare -p a
#>>>declare -i a="333"


arr =(11 22 33 44)
echo ${arr[@]}
declare -p arr
#>>>declare -a arr=([0]="11" [1]="22" [2]="33" [3]="44")

declare#直接使用会输出当前shell环境下的所有变量和函数

#-F可以追溯函数的定义位置 -f输出定义的函数列表
#-r readonly,创建后不可以修改
#-l -u 设置字符串所有字符的大小写
#-n 多个变量指向同一个内存,用于函数内部引用外部数组

(( ))

#((expression))的本质是用来做算数(整数)运算的,也可以在其中运用c++的逻辑进行编写
#在bash进程的内部执行算数表达式
#a = 3
#echo $a 进行变量替换,搜索并引用变量的值,将变量的值替换到命令行中 相当于echo 3
echo $(( a + 3 ))
#>>>6
#对于上边这个命令行来说,没有其他`$`扩展,需要首先进行算术运算,在shell进程内部寻找a的值,运算得到结果6,存放在内存中,然后被`$`引用
echo $(( $a + 3 )) #进行了搜索替换,执行的时候已经是$((3+3))了
#>>>6
#上边进行$(())运算过程中,双小括号内部首先运算,然后结果在内存中,然后继续解析命令,发现有一个`$`符号,所以将内存中数值取出进行替换,变成了`echo 6`,是算术拓展到命令行

#这两个命令行运算结果一致,但是执行过程不一样,对于后者来说先把$a的值进行替换,然后运算,而前者没有变量替换的过程,需要首先进行搜索,然后再进行运算
#算术扩展:将算数运算的结果替换到命令行中
#命令替换:将命令的执行结果(b)
((a=3)) #== declare -i a=3
posted @ 2021-07-13 09:15  -拂石-  阅读(42)  评论(0编辑  收藏  举报