Bash 入门

SHELL十三问


内置1

$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$! 是Shell最后运行的后台Process的PID

cat a.sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
echo "show parm list:$*"
echo "show process id:$$"
echo "show precomm stat: $?"
echo "show last precomm stat: $!"

./a.sh 1 2 3 4 5 6 7 8 9 10 11 12
number:12
scname:./a.sh
first :1
second:2
argume:1 2 3 4 5 6 7 8 9 10 11 12
show parm list:1 2 3 4 5 6 7 8 9 10 11 12
show process id:2134
show precomm stat: 0
show last precomm stat: 0

内置2

source exec .
source 是在原进程中执行,环境变量改变影响本身
. 是fork一个进程,运行和原进程无关
exec 是将原进程结束掉,开始新的进程。

{cmd1;cmd2;cmd3;} 是代码块,还是同一进程。
(cmd1 ) &  开启一个新的进程,且后台执行,提高并发
若所作的修改是临时的,且不想影响只会的设定那就()nested sub-shell

${}
1. 用来区分变量a=1 echo ${a}b
2. 操作
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 
$() 等价于` `
用来做命令替换 ls -l $(which vim)
$(()) 
用来做算术运算

for if
整理
字符串匹配子串

#获得所有文件
for f in * 
do
    echo $f
done

for lst in list
do
    echo $lst
done

for((i=0;i<;i++))
do
    echo $i
done


-a   file :file 存在
-d file :file存在并是一个目录
-e file :file 存在,同- a
-f file :file 存在并且是一个常规的文件(不是目录或者其他特殊类型文件)
-r file :有读的权限
-s file :文件存在且不为空
-w file :有写的权限
-x file :有执行的权限,或者对于目录有search的权限
-N file :在上次读取后,文件有改动
-O file :own所属的文件
-G file :group所属的文件
file1 -nt file2 :file1 比 file2 更新,以最后更新时间为准
file1 -ot file2 :file1 比 file2 更旧 ,以最后更新时间为准

>或者<或者=是用于字符串的比较,如果用于整数比较,使用:
-lt,小于
-le,小于等于
-eq,等于
-ge,大于等于
-gt,大于
-ne,不等于

字符串比较是放置在[...]中,有以下的几种:
str1 = str2,字符串1匹配字符串2
str1 != str2,字符串1不匹配字符串2
str1 > str2,字符串1大于字符串2
str1 < str2,字符串1小于字符串2
-n str,字符串不为null,长度大于零
-z str,字符串为null,长度为零

if [ -n "$dirname" ] &&[ -d "$dirname" ] 
    then
        cd $dirname
        mystack="$dirname ${mystack:-$OLDPWD }"        
        echo $mystack
    else
        echo still in $PWD.        
    fi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值