關於創建用戶腳本的一些小問題

提示:

“引用”一個命令的執行結果,要使用命令引用;比如: RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;
使用一個命令的執行狀態結果,要直接執行此命令,一定不能引用;比如: if id user1一句中的id命令就一定不能加引號;
如果想把一個命令的執行結果賦值給某變量,要使用命令引用,比如USERID=`id -u user1`;
如果想把一個命令的執行狀態結果保存下來,並作爲命令執行成功與否的判斷條件,則需要先執行此命令,而後引用其狀態結果,如

    id -u user1
    RETVAL=$?
    此句絕對不可以寫爲RETVAL=`id -u user1`;

在寫關於添加用戶的腳本時遇到了條件判斷用戶存不存在時的一些問題。這個腳本實現的功能就是判斷一個用戶存不存在,存在就顯示存在,不存在就添加。就是這麼簡單的一個腳本花了我一個多小時,作爲小白的我還是總結一下,以免後面再犯錯誤。
根據一開始的提示我寫的第一個腳本是這樣的

#!/bin/bash
name=user1
if [ id $name &> /dev/null ];then
    useradd $name &> /dev/null
    echo "user $name add finished"
else
    echo "user $name exit"
fi  

因爲想要獲得命令執行狀態結果時,不需要加那個單引號,所以我一開始覺得這個腳本沒有問題,命令執行正確的時候返回值時0,錯誤的時候是非0的其他值。那麼根據我C語言知識來說if後面是0的話就是非執行狀態結果正確的信息就要在else後面顯示,錯誤的信息就要在then後面顯示。但是這個結果大錯特錯!!!!!!!!!

if [  ];then
    echo "A"
else
    echo "B"
fi

在我用這個腳本測試的時候,只有[ ]裏面爲空的時候,也就是什麼都沒有的時候纔會執行else echo B,不管[ ]裏面是0還是任何的其他值,都執行then後面的語句 echo A。這就證明了一個道理:零不代表沒有!,而且就像上面的錯誤腳本一樣,不管是正確的還是錯誤的都有返回值,所以都是執行then後的語句。

所以我就變換了方法,這樣寫:

#!/bin/bash

name=user1

id $name &> /dev/null
reval=$?
if [ $reval -eq 0 ];then
    echo "user $name exit"
else
    useradd $name &> /dev/null
    echo "user $name add finished"      
fi  

這樣就用到了一開始的提示,如果需要保存上一條命令的執行狀態結果的話,就用一個變量存起來。

但是還有一種方法:

#!/bin/bash

name=user1

if  id $name &> /dev/null ;then
  echo "user $name exit"
else
    useradd $name &> /dev/null
    echo "user $name add finished"
fi  

這種方法就不需要加條件測試判斷符號[ ]。 這樣就簡單了,如果user這個用戶存在就執行then後面的語句,如果user用戶不存在就執行else後面的語句。

學習知識,尤其是機算計知識還是要注重實踐,當然首先是要堅持!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章