一些shell命令

select 表達式是一種bash的擴展應用,動作包括:
   (1)、自動用1,2,3,4列出菜單 (沒有echo指令,自動顯示菜單
   (2)、自動read輸入選擇 (沒有 read指令,自動輸入
   (3)、賦值給變量  (沒有賦值指令,自動輸入數字後,賦值字符串給變量

1、   select典型例子

[macg@machome ~]$ vi test.sh

echo "What is your favourite OS?"

select var in "Linux" "Gnu Hurd" "Free BSD" "Other";
do
break               select本身就是一個循環,break是當選擇後,就跳出循環
done

echo "You have selected $var"
[macg@machome ~]$ sh test.sh

What is your favourite OS?

1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 2

You have selected Gnu Hurd   Select輸入選擇是數字,但變量值卻是字符串


2、雖然select本身就是循環,但不建議用他的循環 ,因爲select雖然循環卻不再顯示菜單,只循環輸入所以seleckt 語句乾脆直接用break,只執行一次,在其上另配while循環

while echo "display current netconfig:"
do

select vi in "ifconfig -a" "hosts" "netmasks" "quit"
do

case $vi in      雖然輸入是1,2,3,4,5,但case變量輸入值卻是菜單項(字符串)
"ifconfig -a")  /sbin/ifconfig -a;;
"hosts") more hosts;;
"netmasks") more netmasks;;
"quit") exit 0;;
*) continue;;
esac

break   
done

done 
$ sh test
display current netconfig
1) ifconfig -a      3) netmasks        
2) hosts            4) quit 


3、select空格出錯的問題
問題:
下面的代碼運行出錯,如果package name那沒有空格就沒有問題
select var in "All" "package name"     do
      case $var in
      All)
        break;;
      package name)
        break;;
       *);;
      esac
   done 

解答:
case語句的語法問題,跟變量賦值時一個道理 case裏面的每一個分支變量中要想將空格作爲字符串的一部分,就得加上引號 這樣就好了:  select var in "All" "package name"
  do
      case $var in
      All)
        break;;
      "package name")
        break;;
       *);;
      esac
   done

$! ,$?, $$,$@在shell中代表什麼 

$n        $1 the first parameter,$2 the second... 
$#        The number of command-line parameters. 
$0        The name of current program. 
$?        Last command or function's return value. 
$$        The program's PID. 
$!        Last program's PID. 
$@        Save all the parameters. 

almost any shell book will talk about them,from which you can get their detail usages.


用途說明

declare命令是bash的一個內建命令,它可以用來聲明shell變量,設置變量的屬性(Declare variables and/or give them attributes)。該命令也可以寫作typeset。雖然人們很少使用這個命令,如果知道了它的一些用法,就會發現這個命令還是挺有用的。

 

常用參數

格式:declare

格式:typeset

格式:declare -p

格式:typeset -p

顯示所有變量的值。

 

格式:declare -p var

格式:typeset -p var

顯示指定變量var的值。

 

格式:declare var=value

格式:typeset var=value

格式:var=value

聲明變量並賦值。

 

格式:declare -i var

格式:typeset -i var

將變量var定義成整數。在之後就可以直接對表達式求值,結果只能是整數。如果求值失敗或者不是整數,就設置爲0。

 

格式:declare -r var

格式:typeset -r var

格式:readonly var

將變量var聲明爲只讀變量。只讀變量不允許修改,也不允許刪除。

 

格式:declare -a var

格式:typeset -a var

將變量var聲明爲數組變量。但這沒有必要。所有變量都不必顯式定義就可以用作數組。事實上,在某種意義上,似乎所有變量都是數組,而且賦值給沒有下標的變量與賦值給"[0]"相同。

 

格式:declare -f

格式:typeset -f

顯示所有自定義函數,包括名稱和函數體。

 

格式:declare -F

格式:typeset -F

顯示所有自定義函數名稱。

 

格式:declare -f func

格式:typeset -f func

只顯示指定函數func的函數定義。

 

格式:declare -x var

格式:typeset -x var

格式:export var

將變量var設置成環境變量,這樣在隨後的腳本和程序中可以使用。

 

格式:declare -x var=value

格式:typeset -x var=value

格式:export var=value

將變量var設置陳環境變量,並賦值爲value。

 

使用示例

示例一 declare是內建命令

[root@web ~]#type -a declare 
declare is a shell builtin
[root@web ~]#

[root@jfht ~]#type -a typeset 
typeset is a shell builtin
[root@jfht ~]#

 

示例二 declare -i之後可以直接對表達式求值

[root@web ~]#x=6/3 
[root@web ~]#echo $x 
6/3
[root@web ~]#declare -i x 
[root@web ~]#echo $x    
6/3
[root@web ~]#x=6/3 
[root@web ~]#echo $x 
2

如果變量被聲明成整數,可以把表達式直接賦值給它,bash會對它求值。

[root@jfht ~]#x=error 
[root@jfht ~]#echo $x 
0

如果變量被聲明成整數,把一個結果不是整數的表達式賦值給它時,就會變成0.

[root@jfht ~]#x=3.14 
-bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")
如果變量被聲明成整數,把一個小數(浮點數)賦值給它時,也是不行的。因爲bash並不內置對浮點數的支持。 
[root@web ~]#

[root@jfht ~]#declare +i x

此命令的結果是取消變量x的整數類型屬性。 
[root@jfht ~]#x=6/3 
[root@jfht ~]#echo $x 
6/3

因爲變量x不是整型變量,所以不會自動對表達式求值。可以採用下面兩個方式。

[root@jfht ~]#x=$[6/3] 
[root@jfht ~]#echo $x
2
[root@jfht ~]#x=$((6/3)) 
[root@jfht ~]#echo $x  
2
[root@jfht ~]#

 

示例三 聲明只讀變量

[root@jfht ~]#declare -r r 
[root@jfht ~]#echo $r 

[root@jfht ~]#r=xxx 
-bash: r: readonly variable
[root@jfht ~]#declare -r r=xxx 
-bash: declare: r: readonly variable
[root@jfht ~]#declare +r r   
-bash: declare: r: readonly variable
[root@jfht ~]#
[root@jfht ~]#declare +r r 
-bash: declare: r: readonly variable
[root@jfht ~]#
[root@jfht ~]#unset r 
-bash: unset: r: cannot unset: readonly variable
[root@jfht ~]#

 

示例四 聲明數組變量(實際上,任何變量都可以當做數組來操作)

[root@jfht ~]#declare -a names 
[root@jfht ~]#names=Jack 
[root@jfht ~]#echo ${names[0]} 
Jack
[root@jfht ~]#names[1]=Bone 
[root@jfht ~]#echo ${names[1]} 
Bone
[root@jfht ~]#echo ${names} 
Jack
[root@jfht ~]#echo ${names[*]} 
Jack Bone
[root@jfht ~]#echo ${#names} 
4

直接引用names,相當於引用names[0] 
[root@jfht ~]#echo ${#names[*]} 
2

[root@jfht ~]#echo ${names[@]} 
Jack Bone
[root@jfht ~]#echo ${#names[@]} 
2

[root@jfht ~]#declare -p names   
declare -a names='([0]="Jack" [1]="Bone")'
[root@jfht ~]#

 

示例五 顯示函數定義

[root@jfht ~]#declare -F 
declare -f add_jar
declare -f add_jar2
declare -f add_jar3
[root@jfht ~]#declare -f 
add_jar ()
{
    [ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
add_jar2 ()
{
    if [ -e $1 ]; then
        CLASSPATH=$CLASSPATH:$1;
    else
        if [ -e $2 ]; then
            CLASSPATH=$CLASSPATH:$2;
        fi;
    fi
}
add_jar3 ()
{
    if [ -e $1 ]; then
        CLASSPATH=$CLASSPATH:$1;
    else
        if [ -e $2 ]; then
            CLASSPATH=$CLASSPATH:$2;
        else
            if [ -e $3 ]; then
                CLASSPATH=$CLASSPATH:$3;
            fi;
        fi;
    fi
}
[root@jfht ~]#declare -f add_jar 
add_jar ()
{
    [ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
[root@jfht ~]#declare -F add_jar 
add_jar
[root@jfht ~]#declare -F add_ 
[root@jfht ~]#declare -F add_* 
[root@jfht ~]#declare -F 'add_*' 
[root@jfht ~]#



發佈了31 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章