linux shell 学习笔记
1、shell 子进程 : 在当前shell下打开一个新的shell , 那这个新的shell就是子进程 。
父进程里的自定义变量不能直接在 子进程里使用 , 通过 export 将变量 变成 环境变量后 就可以在 子进程 里使用了 。
进入 子进程 : bash
退出 子进程 : exit
取消设置的变量:unset , 例如: unset name ,取消刚才设置的 name 这个变量 。
反引号(`) 的作用 : 在 一串命令中 在 ` 之内的命令 将 先被执行 , 执行的结果作为 外部输入的命令
例如: 进入目前内核的模块: # cd /lib/modules/`uname -r`/kernel
命令行 :declare -i number=$RANDOM*10/32768 ; echo $number
declare 声明数值类型 , 这里不大明白
$RANDOM 随机数 , echo $RANDOM 输出一个随机数
? (问号) 显示上一个执行命令的回传码 即 , 一个命令执行成功 会 回传一个 0 , 执行失败 就会传回一个非 0 的值 (命令执行失败就 传回来一个错误代码)。
例如: #ls
#echo $? 这里输出 0
表示 他的上一条命令 ls 执行正确 。
2、locale 显示系统所致支持的 国际语言
#locale -a 显示系统所支持的所有的 国际语言 。
查看系统当前的语言编码格式
#cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
3、read : 读取来自键盘输入的变量
格式: read [-pt] variable
-p 输入提示信息 ,例如 请输入你的名字 :
-t 输入等待的时间 , 等待时间过了后 就会略过这个命令 (不让你输入接着执行下面的命令)
例如:
[seaman@seaman911 桌面]$ read -p 'please keyin your name:' -t 20 name
please keyin your name:ddddddddd
[seaman@seaman911 桌面]$ echo $name
ddddddddd
[seaman@seaman911 桌面]$
在以上命令中 输入的 “ddddddddd” 会 被read读取并且赋给 name 这个变量 , name这个自定义变量
4、declare/typeset 声明变量的类型:
declare [-aixr] variable
参数:
-a 将后边命名为 variable 的变量 定义为数组 (array)类型
-i 将后边命名为 variable 的变量 定义为整数数字 (integer)类型
-x 与export 一样 , 将后边的 variable 变成环境变量
-r 将变量设置成为 readonly 类型 , 改变里不可更改内容 , 也不可重设
-p 可以单独列出变量的类型(查看变量的类型)
在用次命令时候 , “ -x ”、“ -a ”等参数前面带减号(-) 是设置操作 ,
“ +x ”、“ +a ” 是执行取消操作 。 如例 2 所示。
例 1:
[seaman@seaman911 桌面]$ sum=33+44+55
[seaman@seaman911 桌面]$ echo $sum
33+44+55
[seaman@seaman911 桌面]$ declare -i sum=33+44+55
[seaman@seaman911 桌面]$ echo $sum
132
[seaman@seaman911 桌面]$
在以上例子中 变量 sum 默认是 “字符串” 型的 , 所以 33+44+55 为一个字符串 不是计算式 。
declare -i sum 把sum定义成一个整数型的变量 , 33+44+55 就是个计算式 了 。
另外 在 bash 环境中的数值运算最多能到达 整数型 所以 1/3 的结果是 0 。
例 2:
把sum设置成环境变量
[seaman@seaman911 桌面]$ declare -x num
取消sum的环境变量的设置
[seaman@seaman911 桌面]$ declare +x num
例 3 、
定义数组变量, 读取数组。 读取数组的时候用 ${数组} 的形式读取 。
[seaman@seaman911 桌面]$ declare -a coupon
[seaman@seaman911 桌面]$ coupon[1]=50
[seaman@seaman911 桌面]$ echo "coupon 1 = ${coupon[1]}"
coupon 1 = 50
[seaman@seaman911 桌面]$ echo ${coupon[1]} 读取输出数组
(。・v・。)变量的替换删除这里不太明白, 从网上 找了个文章 待 实践
假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值):
${file-my.file.txt} :假如 $file 沒有设定,則使用 my.file.txt 作传回值。(空值及非空值時不作处理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。(空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為my.file.txt 。 (非空值時不作处理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值時不作处理)
${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节