Linux中,所有命令都是小写(惯例),所以,建议环境变量都是大写。
set可以查看所有变量,env可以查看环境变量。
后台运行:命令末尾加上 & 。
Shell编程:
- 所有变量默认都是字符串,如变量值带有空格,应使用双引号括起来(不能单引号)。注意,变量赋值=两边不能有空格,否则会被当成命令。
- 调用变量时,需要使用$前缀。--类似PHP,但定义时不需要。
- 重用变量时,如变量x调用自身:$x="$x"abc,或者$x=${x}abc。
- 用户自定义的变量仅在当前shell有效。
- export x=abc,可以将x=abc作为环境变量。 -- 本质上是declare
- unset x,可以删除变量x,无论是环境变量还是自定义变量。
- 输入set -u之后,会提示被调用的变量是否绑定。
语系 locale
修改语系,还要考虑字体。临时修改语系:修改LANG环境变量即可。
注意,环境变量其实都是启动时读取的文件,从中获取的设置。所以,直接修改环境变量中的值,仅当前有效,重启后还原。
-----------------------------
位置变量(不适合第三方用户使用,第三方建议使用read):
- $n 或 ${n},其中 $0 代表当前的命令,其他的代表参数。
- $* 代表参数整体 -- 需要使用"$*" -- 双引号,否则意义不同
- $@ 代表所有参数 -- 需要使用"$@" -- 双引号
- $# 代表参数个数
- $?,代表上一个命令的返回值,如果正确执行了,返回0,否则返回非0。--非0返回值由命令决定。
ls && echo 当第一条命令正确执行后,再执行第二条 -- 判断的就是返回值。
ls || echo 当第一条命令失败后,再执行第二条。 - $$,当前进程pid。
- $!,后台运行的最后一个进程的pid。
-----------------------------
read -p "enter: " name
echo $name
-----------------------------时限
read -p "enter: " -t 30 name
echo $name
-----------------------------不显示
read -p "enter: " -t 30 -s pwd
echo $pwd
-----------------------------限制个数
read -p "enter [m/f]: " -t 30 -n 1 sex
echo $sex
-----------------------------------------------
shell运算符:
declare -a/i/p/r/x VAR 转型a数组/i整数/p显示/r只读/x环境变量
export本质上也是调用了declare -x VAR。
declare -p 可以列出所有的变量。
declare +a/i/p/x VAR 取消。注意 r无效,务必注意。
数值运算,除了declare -i之外:
① expr 或 let
dd=$(expr $aa + $bb) 注意空格必需。
aa=11
bb=555
cc=$(expr $aa + $bb)
② $((运算式))或$[运算式]
-----------------------------------------------
环境变量配置文件 -- 源自一切皆文件。
source 或 . ,刷新配置文件。
-----------------------------------------------
通配符与正则
通配符:? * []
通配符是完全匹配,正则不是。
操作文件的命令,只能识别通配符。find ls等
正则是用于处理数据的。 grep awk sed等
不要使用 "a*",因为*代表0或任意个数,这样意味着任意行都符合。
grep "aa*" test.txt
. 匹配除了换行符之外的一个任意字符
grep -n "s.d" test.txt
grep "s..d" test.txt
grep "s.*d" test.txt
grep ".*" test.txt //类似"a*",但是"a*"会有问题
^ 行首或取反,同Java
$ 行尾
grep -n "^$" abc
[] 同Java
转义:\. \{ \} 转成本义
\{n\}
\{n,\}
\{n,m\}
grep -v "root" test.txt 不含有"root"的行
cut,列提前
cut -f n test.txt n为列,默认分隔符为制表符
cut -f a,b,c -d "" test.txt 自定义分隔符delimiter