是否可以從Unix控制檯調用函數(在shell腳本中定義)?我有一個功能,如在Bourne Shell中調用函數
add()
{
a=$1
b=$2
c=`expr $a + $b`
}
這是在腳本"my_script.sh"
定義。如何從命令提示符調用此函數?
是否可以從Unix控制檯調用函數(在shell腳本中定義)?我有一個功能,如在Bourne Shell中調用函數
add()
{
a=$1
b=$2
c=`expr $a + $b`
}
這是在腳本"my_script.sh"
定義。如何從命令提示符調用此函數?
要使用參數,您不應用重定向運算符<
,該操作符將在<
之後給出的文件重定向到程序的標準輸入。您需要在腳本中調用您的函數,才能使用參數$...
,或者您可以簡單地將函數加載到您的shell中,然後使用它。
在這兩種情況下,你的函數的調用要這樣進行:
add arg1 arg2
如果命令行,你必須加載.sh
文件的內容 - 你的函數定義 - ,所以你可以從你的shell中調用它們。在這一種情況下,你的文件應該是這樣的:
#! /bin/bash
add() {
a=$1
b=$2
c=$(expr $a + $b)
echo $c
}
,並會做使用該功能在你的shell執行以下操作:
source script.sh
add 100 1000
如果您的script.sh文件,可以使用:
./script.sh arg1 arg2
和腳本文件的內容將是:
#! /bin/bash
add() {
a=$1
b=$2
c=$(expr $a + $b)
echo $c
}
add $1 $2
Obs:你的語法在函數定義中是無效的:你必須擁有一個表達式來分配它的評估結果;評估表達式的語法可以是cmd
或$(cmd),不同之處在於第一種方法不允許嵌套調用。
如果您定義了多個函數,您可以爲每個函數調用設置參數,或者簡單地定義函數,然後使用「source script.sh」將它們加載到shell中。
由於您已經加載了函數,因此您需要調用它們以及它們是否已被逐一定義。函數中的參數對應於C中的經典「argv []」參數,它們對函數調用是唯一的。
例如,如果你想定義的添加和子功能,你必須:
#! /bin/bash
add() {
a=$1
b=$2
c=$(expr $a + $b)
echo $c
}
add $1 $2
sub() {
a=$1
b=$2
c=$(expr $a - $b)
echo $c
}
sub $3 $4
或者任何參數的數字可能適合您的應用。
請注意,您可能會忽略變量的「語義」:這可能是由bash腳本的動態範圍引起的,每次執行調用時都會影響變量定義。
一個簡單的例子就是for循環。考慮所限定的附加功能如下:
add() {
let i=$1 + $2
}
而for循環被作爲執行:
for ((i = 0; i < 10; i++)); do
echo $i
add i 5
echo $i
done
的輸出是:
0
5
6
11
自變量 「i」 已經被修改,在for循環期間,不僅通過「i ++」,而且通過函數「add」,在其範圍中使用「i」。
如果腳本文件具有多個功能,該怎麼辦? #! /斌/慶典 加載(){ 一個= $ 1 B = $ 2 C = $(表達式$一個+ $ b)中 回波$ C } 添加$ 1 $ 2 子(){ 一個= $ 1 b = $ 2 C = $(表達式$一個 - $ b)中 回波$ C } 子$ 1 $ 2 –
@NathanPk則任一組用於每個函數調用的指定參數時,或簡單地定義函數,並將它們加載到您的shell與「源腳本.sh」。既然你已經加載了函數,你需要調用它們以及它們是否已經被逐一定義。函數內的參數對應於C語言中的經典argv參數,它們對函數調用是唯一的。 – Rubens
...如果你指出,你會有:#!/bin/bash add(){a = $ 1 b = $ 2 c = $(expr $ a + $ b)echo $ c} add $ 1 $ 2 sub(){a = $ 1 b = $ 2 c = $(expr $ a - $ b)echo $ c} $ 3 $ 4(或其他適合您的應用程序的東西)。不過請注意,您可能會問這是因爲在函數中,您已經失去了變量的「語義」:這可能是由bash腳本的動態範圍引起的,每次調用都會影響變量定義執行。 – Rubens
我試圖從命令提示符調用此函數。我不知道使用shell命令的新命令的確切命令。我嘗試運行該文件,然後調用這個函數,如「/.my_script.sh
將'源'或使用'.profile'工作? –