1. 程式人生 > >shell 中的操作符

shell 中的操作符

suid權限 ado app 表示 翻譯 cau AS int 一次

1、算術操作符

2、關系操作符

3、布爾操作符

4、字符串操作符

5、文件相關操作符

算術操作符

bash shell 沒有提供任何機制來執行簡單的算術運算,不過我們可以借助於一些其他程序,如 expr

#!/bin/sh

val=`expr 2 + 2`
echo "Total value : $val"

註意:在操作符與表達式之間必須有空格,整個表達式應該用反引號括起來。

其他可用算術操作符:

+:`expr 10 + 20`

-:`expr 10 - 20`

*: `expr 10 \* 20` (需要轉義乘號)

/: `expr 10 / 2`

%: `expr 10 % 3`

=: (賦值) a = $b,將 b 的值賦予 a

==: [ $a == $b ] 判斷兩個數是否相等,相等返回 true

!=: [ $a != $b ] 判斷兩個數是否不想等,不想等返回 true

註意:所有的條件表達式裏面的變量、操作符都需要有逗號分隔。至於為什麽這樣,個人覺得是類似於 $1, $2 ... $n,這種參數獲取方式,如果連在一起,可能系統就把這連在一起的兩個當作一個操作數什麽的。

關系操作符

-eq:判斷兩個操作對象是否相等,例:[ $a -eq $b ]

-ne:判斷兩個操作對象是否不想等,例:[ $a -ne $b ]

-gt:判斷第一個操作對象是否大於第二個操作對象,例:[ $a -gt $b ]

-lt:判斷第一個操作對象是否小於第二個操作對象,例:[ $a -lt $b ]

-ge:[ $a ge $b ],判斷 $a 是否大於等於 $b

-le: [ $a le $b ],判斷 $a 是否小於等於 $b

邏輯操作符

-a:與,[ $a -lt 20 -a $b -gt 100 ] ,$a 小於 20 且 $b 大於 100 的時候返回 true

-o:或,[ $a -lt 20 -o $b -gt 100 ] ,$a 小於 20 或 $b 大於 100 的時候返回 true

!:非,[ ! false ] 返回 true

字符串比較

=:[ $a = $b ],判斷 $a 與 $b 是否相等,註意不是 "=="

!=:[ $a != $b ],判斷 $a 與 $b 是否不想等

-z:判斷字符串長度是否為0,[ -z $a ],如果 $a 長度為0返回 true

-n:判斷字符串長度是否不為0,[ -n $a ],如果 $a 長度不為0返回 true

str:[ $a ],字符串裏面如果全是空格,會返回 false," " => false,獲取字符串長度的方法:${#str}

暫時不知道 -z 和 -n 的具體用法,上面的 -z 和 -n,在字符串長度不為 0 的時候 -z 也返回了 true。

文件相關判斷符

-b:判斷文件是不是 block special 文件,硬盤分區是 block special 文件,如:[ -b /dev/disk1s1 ] 會返回 true。

-c:判斷文件是不是 character special 文件,[ -c $file ]

-d:判斷是不是 目錄

-f:判斷是不是普通文件,而不是目錄或特殊文件

-g:判斷文件是否設置了 SGID(Set GID)

-k:判斷文件是否設置了 SBIT(Sticky Bit)

-p:判斷文件是否是命名管道

-t:判斷文件描述符是否是打開狀態並且關聯了終端

-u:判斷文件是否設置了 SUID(Set User ID)

-r:判斷文件是否可讀

-w:判斷文件是否可寫

-x:判斷文件是否可執行

-s:判斷文件的大小是否大於 0

-e:判斷文件是否存在

擴展閱讀:

1、character special 和 block special 文件類型

When a program reads or writes data from a file, the requests go to a kernel driver. If the file is a regular file, the data is handled by a filesystem driver and it is typically stored in zones on a disk or other storage media, and the data that is read from a file is what was previously written in that place. There are other file types for which different things happen.

When data is read or written to a device file, the request is handled by the driver for that device. Each device file has an associated number which identifies the driver to use. What the device does with the data is its own business.

Block devices (also called block special files) usually behave a lot like ordinary files: they are an array of bytes, and the value that is read at a given location is the value that was last written there. Data from block device can be cached in memory and read back from cache; writes can be buffered. Block devices are normally seekable (i.e. there is a notion of position inside the file which the application can change). The name “block device” comes from the fact that the corresponding hardware typically reads and writes a whole block at a time (e.g. a sector on a hard disk).

Character devices (also called character special files) behave like pipes, serial ports, etc. Writing or reading to them is an immediate action. What the driver does with the data is its own business. Writing a byte to a character device might cause it to be displayed on screen, output on a serial port, converted into a sound, ... Reading a byte from a device might cause the serial port to wait for input, might return a random byte (/dev/urandom), ... The name “character device” comes from the fact that each character is handled individually.

翻譯過來大致是:

塊設備(block special) 讀寫數據的時候是交給設備驅動處理的,怎麽處理是設備驅動的事。塊設備的數據讀寫可緩存,塊設備讀寫數據的單位是 block(如:磁盤上的一個扇區)。

字符文件(character special) 讀寫數據類似於管道,端口;讀寫是即時處理的;寫入這些文件的時候結果可能是顯示到屏幕、輸出到端口、轉換成聲音等,從這些文件讀取的時候,可能會導致端口等待輸入,或者返回一個隨機的 byte(/dev/urandom);之所以叫 character special 是因為這些文件一次只會處理單個字符。

2、SGID、SUID、Sticky Bit

SUID

SUID 會出現在文件擁有者權限的執行位上,具有這種權限的文件會在其執行時,使調用者暫時獲得該文件擁有者的權限。

如:

ls -l /usr/bin/passwd 

結果:

-rwsr-xr-x 1 root root 42824 Sep 13  2012 /usr/bin/passwd  

我們可以看到文件擁有者的執行位那裏是 s而不是x, 所以說passwd這個程序是具有SUID權限的。我們直到在修改用戶密碼的時候,用的就是passwd這個命令,而我們又知道在linux下面,用戶密碼是存儲在/etc/shadow這個文件裏面的。首先查看一下/etc/shadow這個文件的權限:

ls -l /etc/shadow  

結果:

-rw-r----- 1 root shadow 1138 Dec 13 20:00 /etc/shadow  

由上面的結果,我們知道只有root可以往shadow文件中寫入數據,其他用戶連查看的權限都沒有。那我們平時是怎麽修改密碼呢?沒錯,就是和SUID有關。當我們使用passwd命令時,就獲得了passwd的所有者即root的權限,進而可以對shadow文件進行寫入操作。使用SUID肯定滿足一下幾點:

1.SUID只對二進制文件有效

2.調用者對該文件有執行權

3.在執行過程中,調用者會暫時獲得該文件的所有者權限

4.該權限只在程序執行的過程中有效

SGID

SGID即Set GID的縮寫,它出現在文件所屬組權限的執行位上面,它對普通二進制文件和目錄都有效。當它作用於普通文件時,和SUID類似,在執行該文件時,用戶將獲得該文件所屬組的權限。當SGID作用於目錄時,意義就非常重大了。當用戶對某一目錄有寫和執行權限時,該用戶就可以在該目錄下建立文件,如果該目錄用SGID修飾,則該用戶在這個目錄下建立的文件都是屬於這個目錄所屬的組。

  

SBIT

SBIT即Sticky Bit,它出現在其他用戶權限的執行位上,它只能用來修飾一個目錄。當某一個目錄擁有SBIT權限時,則任何一個能夠在這個目錄下建立文件的用戶,該用戶在這個目錄下所建立的文件,只有該用戶自己和root可以刪除,其他用戶均不可以。例如:

ls -ld /tmp  

結果:

drwxrwxrwt 12 root root 12288 Dec 17 16:33 /tmp  

可以看到最後一位為t,這說明/tmp文件就是這種文件。

那麽,如何設置上面所說的三種權限呢?首先來介紹一點預備的知識,用數字來表示權限:

4表示SUID  
2表示SGID  
1表示SBIT  

如果兩個或三個權限同時存在時,就將者寫權限的值相加就是需要的結果了。利於SUID和SGID同時存在,則為6。下面可以看一下修改的例子:

 chmod 4777 test 
使test文件具有SUID權限,你可能已經看明白了,就是在普通文件權限前面再加上這些特殊權限值就可以了。

shell 中的操作符