centos shell腳本編程1 正則 shell腳本結構 read命令 date命令的用法 shell中的邏輯判斷 if 判斷文件、目錄屬性 shell數組簡單用法 $( ) 和${ } 和$(( )) 與 sh -n sh -x sh -v 第三十五節課


centos   shell腳本編程1 正則  shell腳本結構  read命令  date命令的用法  shell中的邏輯判斷  if 判斷文件、目錄屬性  shell數組簡單用法 $( ) 和${ } 和$(( )) 與  sh -n  sh -x  sh -v 第三十五節課

 

 

Shebang/Sha-bang
在計算機科學中, Shebang (也稱為Hashbang)是一個由井號和嘆號構成的字符串行(#!), 其出現在文本文件的第一行的前兩個字符.
在文件中存在Shebang的情況下, 類Unix操作系統的程序載入器會分析Shebang后的內容, 將這些內容作為解釋器指令, 並調用該指令, 並將載有Shebang的文件路徑作為該解釋器的參數. 例如, 以指令#!/bin/sh開頭的文件在執行時會實際調用/bin/sh程序.)

#!用於幫助內核找到相應的解釋器,只有被直接執行的文件中才有必要加入#!

Shebang指明了執行這個腳本文件的解釋程序。
1. 如果腳本文件中沒有#!這一行,那么它執行時會默認用當前Shell去解釋這個腳本(即:$SHELL環境變量)。
2. 如果#!之后的解釋程序是一個可執行文件,那么執行這個腳本時,它就會把文件名及其參數一起作為參數傳給那個解釋程序去執行。
3. 如果#!指定的解釋程序沒有可執行權限,則會報錯“bad interpreter: Permission denied”。
如果#!指定的解釋程序不是一個可執行文件,那么指定的解釋程序會被忽略,轉而交給當前的SHELL去執行這個腳本。
4. 如果#!指定的解釋程序不存在,那么會報錯“bad interpreter: No such file or directory”。
注意:#!之后的解釋程序,需要寫其絕對路徑(如:#!/bin/bash),它是不會自動到$PATH中尋找解釋器的。
5. 當然,如果你使用”bash test.sh”這樣的命令來執行腳本,那么#!這一行將會被忽略掉,解釋器當然是用命令行中顯式指定的bash。

 

 

 

注意:腳本寫到一行最好用分號; 

if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo ok;else echo notok; fi

 

每個結構語句后面都可以加分號表示語句的結束,但是分多行來書寫不會加任何分號更加美觀

#!/bin/bash
cd /etc/ ;
for a in `ls /etc/` ;
do  
if [ -d /etc/$a ]  ;
then
ls -d /etc/$a ;
fi ;
done ;

對比

#!/bin/bash
cd /etc/
for a in `ls /etc/`
do  
if [ -d /etc/$a ]  
then
ls -d /etc/$a
fi
done 

 



 

 

上半節課
正則
shell腳本結構
date命令的用法

 

下半節課
shell中的邏輯判斷
if 判斷文件、目錄屬性
shell數組簡單用法
sh -n sh -x  sh -v 
$( ) 和${ } 和$(( ))

 

 

內容概要:
1. shell腳本是什么
它是一種腳本語言,並非編程語言
可以使用一些邏輯判斷、循環等語法
可以自定義子函數
是系統命令的集合
shell腳本可以實現自動化運維,大大增加我們的工作效率
正則
.:任意一個字符
*:結合星號前面的符號,a* 0個或多個a
+:grep不可以直接,加大E 或者egrep 或者脫義符號 grep 'a\+' 一個或多個a
?:0個或多個a
.*:貪婪匹配
():匹配,然后替換
(ab){2,4}: 出現2到4次ab
[^:]+:非冒號開頭的一個或多個
([^:]+)(:.*:)([^:]+) 匹配多段
sed -r 's/([^:]+)(:.*:)([^:]+) /\3\2\1/' /etc/passwd
awk -F ':' '{print $7}' /etc/passwd

 

 

2. shell腳本結構以及執行方法以及命名規則
開頭行指定bash路徑: #! /bin/bash
以#開頭的行作為解釋說明
腳本的名字以.sh結尾,用於區分這是一個shell腳本
執行方式有兩種:chmod +x 1.sh; ./1.sh 如果沒有執行權限可以 bash 1.sh
bash -x 1.sh 可以查看腳本執行過程
shell的變量和函數命名不能有橫杠,只能是大小寫字母、 下划線、 數字  例如  check-service(){} 錯誤 check_service(){} 正確

 

 

3. 學會date命令的用法
命令格式:date [參數]... [+格式]
選擇參數:
-d<字符串>  顯示字符串所指的日期與時間。字符串前后必須加上雙引號。
-s<字符串>  根據字符串來設置系統日期與時間。字符串前后必須加上雙引號。

注意:如果有空格需要用雙引號引起來:date +"%Y%m%d %H%M"  不用雙引號date +%Y%m%d-%H%M
CST:中國時區,北京時間
EST :東部標准時間
date +%Y-%m-%d, date +%y-%m-%d 年月日
大Y 四位年 小y兩位年 小m月 大M分鍾 小d天 小h月 大H小時 大S秒 小s時間戳(大Y 四位年 小m月 小d天 大H小時 大M分鍾 大S秒 )
date +%H:%M:%S = date +%T 時間
date +%Y-%m-%d = date +%F 年月日
date +"%Y-%m-%d %H:%M:%S" 2016-01-20 10:36:47 雙引號引起來
date +%w 星期幾
date +%W 第幾周
date +%s 時間戳
date -d @1434248742 反推時間戳,時間戳是1434248742
date -d "+1day" +"%Y-%m-%d"一天后
date -d "-1day" +"%Y-%m-%d"一天前
date -d "-1month" +"%Y-%m-%d"一月前
date -d "-1min" +"%Y-%m-%d %H:%M:%S"一分鍾前
date -d "-1year" +"%Y-%m-%d" 一年前
date -d "-1weak" +"%Y-%m-%d" 一個星期前
兩部分
第一部分-d "-1weak"
第二部分+"%Y-%m-%d"

 

 

4. shell腳本中的變量
當腳本中使用某個字符串較頻繁並且字符串長度很長時就應該使用變量代替
使用條件語句時,常常使用變量 if [ $a -gt 1 ]; then ... ; fi
引用某個命令的結果時,用變量替代 n=`wc -l 1.txt`或者 n=$(wc -l 1.txt)
寫和用戶交互的腳本時,變量也是必不可少的 read -p "Input a number: " n; echo $n 如果沒寫這個n,可以直接使用全局變量$REPLY
內置變量 $0, $1, $2… $0表示腳本本身,$1 第一個參數,$2 第二個 ....
$#:表示參數個數或最后一個參數
$* 所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@ :表示以空格分隔的所有輸入參數或者所有函數參數所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$$:當前shell進程的pid
$!:后台運行的最后一個進程的pid
$- 使用Set命令設定的Flag一覽

數學運算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
變量的作用域和屬性 :readonly 、local

 

 

 

5. shell中的邏輯判斷
格式1:if 條件 ; then 語句; fi
格式2:if 條件; then 語句; else 語句; fi
格式3:if …; then … ;elif …; then …; else …; fi
格式4:if 命令;then 語句;fi
邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到處都是空格 方括號兩邊也有空格 if [ 1 == 1 ] then xx fi
可以使用 && || 結合多個條件 -a也表示&&,-o也表示||
冒號表示真 if : then xx fi


用兩個括號可以避免使用lt,gt
if (($a<3)); then echo ok;else echo nook;fi
if (($a>3)); then echo ok;else echo nook;fi

 

字符串比較用(==)和(!=) ,不能用-eq和 -ne
if [ "s" == "e" ]; then echo 1 ;fi
if [ "s" != "e" ]; then echo 1 ;fi

 

if:
格式:注意[]兩邊都有空格 邏輯操作符兩邊也要留空格
#!/bin/bash
if [ 1 == 2 ]
then
echo true;
elif [ 1 == 3 ] ;then
echo false;
else
echo error;
fi

> gt
< lt
>= ge
<= le
== eq
!= ne

 
if 命令 
判斷的基礎
1、有返回值 每個命令都有返回值
2、有正確的返回值 0是真 非0是假 echo $?

注意,if 命令不能加中括號  ,if [ 命令 ]是錯的

例子

if  ping -c 1 192.168.1.106 >/dev/null 2>&1 ; then echo 1; else echo 2; fi

if sed -i 's/i/gg/g' sed.txt
if /bin/true ;
grep -q 避免輸出

 


if [$a -lt 10] && [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -a $a -gt 1]; then echo ok;fi

if [$a -lt 10] || [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -o $a -gt 1]; then echo ok;fi


exit返回碼 exit 1 ,那么echo $? 就會顯示1

 

6. if 判斷文件、目錄屬性
[ -f file ]判斷是否是普通文件,且存在 [ ! -f file ]
[ -d file ] 判斷是否是目錄,且存在 [ ! -d file ]
[ -e file ] 判斷文件或目錄是否存在 [ ! -e file ]
[ -r file ] 判斷文件是否可讀 [ ! -r file ]
[ -w file ] 判斷文件是否可寫 [ ! -w file ]
[ -x file ] 判斷文件是否可執行 [ ! -x file ]
[ -z $a ] 判斷變量是否為空 [ ! -z  ]

if 簡化寫法
[ -f 2.sh ] && echo "2.sh exits"

[ ! -f 2.sh ] || echo "2.sh exits"

 

 

示例1

read -p  xx  n  ,n只是一個變量名,你可以用x,y,z
#!/bin/bash
read -p "input a number" n
n2=`echo $n|grep -E '[^0-9]'|wc -l`

if [ $n2 == 1 ]
then
echo " not a nubmer"
exit 1
fi

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo "even"
else
echo "odd"
fi

示例2
#根據命令的返回值 echo $? echo $n|grep -q '[^0-9]' 0是真 非0是假  (if netstat -lnp |grep -Eq ':80'   精確匹配 有返回值是0 無返回值是假)
#!/bin/bash
read -p "input a number" n
#n2=`echo $n|grep -E '[^0-9]'|wc -l`
if echo $n|grep -q '[^0-9]'
then
echo " not a nubmer"
exit 1
fi

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo "even"
else
echo "odd"
fi


示例2
#根據命令的返回值 echo $? echo $n|grep -q '[^0-9]' 0是真 非0是假
#!/bin/bash
read -p "input a number" n
#n2=`echo $n|grep -E '[^0-9]'|wc -l`
if echo $n|grep -q '[^0-9]'
then
echo " not a nubmer"
exit 1
fi

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo "even"
else
echo "odd"
fi

示例3
[root@steven ~]# if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo ok;else echo notok; fi
notok
[root@steven ~]# if [ $? == 0 ] ;then echo ok;else echo notok; fi
ok


示例4
exec表示后面的命令的輸出都重定向到/tmp/$d.log
#!/bin/bash
d=`date +%F`
exec >/tmp/$d.log 2>&1
echo "begin at `date`"
ls /tmp/sdfsdfcd
cd /sdfsdf
echo "end at `date`"

 


擴展閱讀

http://www.jb51.net/article/56553.htm

 

附 表:
[ -a FILE ]  如果 FILE 存在則為真。  
[ -b FILE ]  如果 FILE 存在且是一個塊特殊文件則為真。  
[ -c FILE ]  如果 FILE 存在且是一個字特殊文件則為真。  
[ -d FILE ]  如果 FILE 存在且是一個目錄則為真。  
[ -e FILE ]  如果 FILE 存在則為真。  
[ -f FILE ]  如果 FILE 存在且是一個普通文件則為真。  
[ -g FILE ] 如果 FILE 存在且已經設置了SGID則為真。 [ -h FILE ]  如果 FILE 存在且是一個符號連接則為真。  
[ -k FILE ]  如果 FILE 存在且已經設置了粘制位則為真。  
[ -p FILE ]  如果 FILE 存在且是一個名字管道(F如果O)則為真。  
[ -r FILE ]  如果 FILE 存在且是可讀的則為真。  
[ -s FILE ]  如果 FILE 存在且大小不為0則為真。  
[ -t FD ]  如果文件描述符 FD 打開且指向一個終端則為真。  
[ -u FILE ]  如果 FILE 存在且設置了SUID (set user ID)則為真。  
[ -w FILE ]  如果 FILE 如果 FILE 存在且是可寫的則為真。  
[ -x FILE ]  如果 FILE 存在且是可執行的則為真。  
[ -O FILE ]  如果 FILE 存在且屬有效用戶ID則為真。  
[ -G FILE ]  如果 FILE 存在且屬有效用戶組則為真。  
[ -L FILE ]  如果 FILE 存在且是一個符號連接則為真。  
[ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last read則為真。  
[ -S FILE ]  如果 FILE 存在且是一個套接字則為真。  
[ FILE1 -nt FILE2 ]  如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not則為真。  
[ FILE1 -ot FILE2 ]  如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則為真。  
[ FILE1 -ef FILE2 ]  如果 FILE1 和 FILE2 指向相同的設備和節點號則為真。  
[ -o OPTIONNAME ]  如果 shell選項 “OPTIONNAME” 開啟則為真。  
[ -z STRING ]  “STRING” 的長度為零則為真。  
[ -n STRING ] or [ STRING ]  “STRING” 的長度為非零 non-zero則為真。  
[ STRING1 == STRING2 ]  如果2個字符串相同。 “=” may be used instead of “==” for strict POSIX compliance則為真。  
[ STRING1 != STRING2 ]  如果字符串不相等則為真。
[ STRING1 < STRING2 ]  如果 “STRING1” sorts before “STRING2” lexicographically in the current locale則為真。  
[ STRING1 > STRING2 ]  如果 “STRING1” sorts after “STRING2” lexicographically in the current locale則為真。  
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

 


 

sh -x 調試shell腳本

sh -x 11.sh 
+ '[' 1 -eq 1 ']'
+ eco 1
11.sh: line 4: eco: command not found

 

sh -n  檢查shell腳本語法

sh -n 11.sh

 

sh -v  顯示整個shell腳本並執行

sh -v 11.sh 
#!/bin/bash
if [ 1 -eq 1 ]
then 
eco 1
else
echo 2
fi
11.sh: line 4: eco: command not found

有時候使用-v選項會更加直觀看到shell腳本的語法錯誤

 

 

sh -c 啟動一個子進程,執行字符串里的命令,字符串后面的參數作為字符串里命令的參數

sh -c 'ls /tmp'sh -c 'ls ' /tmp

 

 

 


$( ) 和${ } 和$(( )) 與差在哪  http://blog.chinaunix.net/uid-12380499-id-105461.html

$( ) 引用結果

${ }變量累加

$(( )) 整數運算

 

a=sss
b=${a}123
echo $b
sss123
c=$(wc -l /etc/passwd|awk '{print $1}')
echo $c
38
y=$((5+c))
echo $y
43

n=$(wc -l 1.txt)

 


shell數組簡單用法

http://www.apelearn.com/bbs/thread-7235-1-1.html

1.數組定義, 一對括號表示是數組,數組元素用“空格”符號分割開。

# a=(1 2 3 4 5)
# echo $a
1

2. 數組讀取
# echo ${#a[@]} //獲取數組的元素個數
# echo ${a[2]} //讀取數組中的某一個元素,數標從0開始,a[0]是第一個元素
# echo ${a[*]} //這樣會打印整個數組的元素,或者使用 echo ${a[@]}

3. 數組賦值
# a[1]=100

# echo ${a[*]} 
1 100 3 4 5

# a[5]=100 
# echo ${a[*]}
1 100 3 4 5 100

直接通過 數組名[下標] 就可以對其進行引用賦值,如果下標不存在,自動添加新一個數組元素

4. 數組的刪除
# a=(1 2 3 4 5)
# unset a
# echo ${a[*]}

# a=(1 2 3 4 5)
# unset a[1] 
# echo ${a[*]} 
1 3 4 5
# echo ${#a[*]}
4

5. 數組分片
# a=(`seq 1 5`)
# echo ${a[@]:0:3}
1 2 3
# echo ${a[@]:1:4}
2 3 4 5

6. 數組替換,可以echo替換,也可以直接賦值
# a=(1 2 3 4 5) 
# echo ${a[@]/3/100}
1 2 100 4 5
# echo ${a[@]}
1 2 3 4 5
# a=(${a[@]/3/100}) 
# echo ${a[@]} 
1 2 100 4 5

 


 

SHELL變量名必須遵循下面規律

1、首個字母必須為字母a-zA-Z

2、中間不能有空格,可以用下划線_

3、不能使用標點符號

4、不能用bash關鍵字(可用help命令查看是否保留關鍵字)


 

read命令

read命令 接受標准輸入或其他文件描述符的輸入,得到輸入后,read命令將數據放入一個標准變量中

利用read讀取文件時,每次調用read命令都會讀取文件中的“一行”文本。當文件沒有可讀的行時,read命令以非零狀態退出

示例

while read myline
do
echo "line: $myline"
done < /tmp/myfile.txt

cat /tmp/myfile.txt | while read myline
do
echo "line: $myline"
done

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib,move $srcdir | while read file
do
for ip in $dstip
do
rsync -avH --port=873 --progress --delete --exclude-from=$excludedir $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done

read -p "input a number" n  或read  n  #監聽終端的標准輸入

當然也可以用for循環和sed -n ""p 讀取文件的每行文本

  

 

read -p "Enter [start|stop] to start or stop redis-server:" -e -i start option

-e :使用-i 選項的默認值填充到option變量

-i start :[-i text],提示默認值是start


shell變量
http://blog.csdn.net/zhuying_linux/article/details/6633022

在shell中有3種變量:系統變量,環境變量和用戶變量,其中系統變量在對參數判斷和命令返回值判斷時會使用,環境變量主要是在程序運行時需要
readonly

local

declare



另外,如果在賦值后不希望改變變量,使其類似於常數,則可以使用readonly命令將其設為只讀。
//先賦值,再設置只讀
#a=good
#readonly a
//或者直接在賦值時設置只讀
#readonly a=good
此時若用unset命令重置變量a或者對a重新賦值,則會產生錯誤。
#unset a
-bash: a: readonly variable
#a=Good
-bash: a: readonly variable

另外,shell的變量默認是全局作用的,如果需要在一定范圍內生效,則需要加上local限制。例如local a將設置a為局部變量。
Tar_Cd()
{
    local FileName=$1
    local DirName=$2
}


數字和數組的聲明
默認的賦值是對字符串賦值,例如執行如下腳本,就會發現這個腳本並沒有使用5和6相加輸出“11”,而是輸出“5+6”。
#!/bin/bash
a=5
b=6
c=$a+$b
echo $c

如果要對數字或數組進行聲明,則要declare命令,例如上例改成如下形式,即可正常進行加減。

#!/bin/bash
declare -i a=5
declare -i b=6
declare -i c=$a+$b
echo $c

declare支持的聲明類型如下。使用“- 類型”開啟,“+ 類型”關閉。
(1)i:定義整數integer
(2)a:定義數組array
(3)f:定義函數function
(4)r:定義為只讀readonly
(5)x:定義為通過環境輸出變量

例如對聲明數組變量的方法如下。
#!/bin/bash
declare -a arr=(a b c )

 


linux下時間戳轉換 date
http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=8092&fromuid=4587

 

shell中獲取時間戳的方式為:date -d "$currentTime" +%s

$ date -d @1337743485671 "+%c"
Sun 28 May 44361 12:41:11 PM CST

如果要將一個日期轉為時間戳,方式如下:

1、得到當前時間

currentTime=`date "+%Y-%m-%d %H:%M:%S"`


2、將日期轉為時間戳

currentTimeStamp=`date -d "$currentTime" +%s `
echo $currentTimeStamp

3.字符串轉換為時間戳可以這樣做:

date -d "2010-10-18 00:00:00" +%s

輸出形如:

1287331200

其中,-d參數表示顯示指定的字符串所表示的時間,+%s表示輸出時間戳。

4.而時間戳轉換為字符串可以這樣做:

date -d @1287331200

輸出形如:

Mon Oct 18 00:00:00 CST 2010

 


Shell腳本8種字符串截取方法總結
http://www.jb51.net/article/56563.htm


這篇文章主要介紹了Shell腳本8種字符串截取方法總結,每個方法給出了實例代碼和操作結果,一目了然,需要的朋友可以參考下

 

echo ${var *  *  * }
#    匹配左邊第一   留右  從左邊起
## 匹配左邊最后     留右  從左邊起
%   匹配右邊第一    留左  從右邊起
%% 匹配右邊最后     留左  從右邊起

星號表示要刪除的字符
var#  * //  刪除左邊字符,保留右邊字符。
var## * /
var%   /  *
var%%  /  *

Linux 的字符串截取很有用。有八種方法。
假設有變量 var=http://www.aaa.com/123.htm


1. # 號截取,刪除左邊字符,保留右邊字符。

var=http://www.aaa.com/123.htm
echo ${var#*//}

其中 var 是變量名,# 號是運算符,*// 表示從左邊開始刪除第一個 // 號及左邊的所有字符
即刪除 http://
結果是 :www.aaa.com/123.htm


2. ## 號截取,刪除左邊字符,保留右邊字符。

var=http://www.aaa.com/123.htm
echo ${var##*/}

##*/ 表示從左邊開始刪除最后(最右邊)一個 / 號及左邊的所有字符
即刪除 http://www.aaa.com/
結果是 123.htm


3. %號截取,刪除右邊字符,保留左邊字符

var=http://www.aaa.com/123.htm
echo ${var%/*}

%/* 表示從右邊開始,刪除第一個 / 號及右邊的字符
結果是:http://www.aaa.com


4. %% 號截取,刪除右邊字符,保留左邊字符

var=http://www.aaa.com/123.htm
echo ${var%%/*}

%%/* 表示從右邊開始,刪除最后(最左邊)一個 / 號及右邊的字符
結果是:http:


5. 保留/打印從左邊第幾個字符開始,及字符的個數

var=http://www.aaa.com/123.htm
echo ${var:0:5}

其中的 0 表示左邊第一個字符開始打印,5 表示字符的總個數。
結果是:http:


6. 從左邊第幾個字符開始,一直到結束。

var=http://www.aaa.com/123.htm
echo ${var:7}

其中的 7 表示左邊第8個字符開始,一直到結束。
結果是 :www.aaa.com/123.htm

7. 從右邊第幾個字符開始,及字符的個數

var=http://www.aaa.com/123.htm
echo ${var:0-7:3}

其中的 0-7 表示右邊算起第七個字符開始,3 表示字符的個數。
結果是:123


8. 從右邊第幾個字符開始,一直到結束。

var=http://www.aaa.com/123.htm
echo ${var:0-7}

表示從右邊第七個字符開始,一直到結束。
結果是:123.htm
注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)

 


花括號批量創建文件或目錄

mkdir -p man/mm{1..6} 1..6 中間一定要是兩點 !!!!!!
ll
total 24
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm1
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm2
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm3
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm4
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm5
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm6

 



括號包起來的命令會產生一個子shell,在這個子shell里面執行的操作不會影響到我們當前shell
(umask 077)

 

 

 

f


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM