我有一个看起来像这样的bash方法
function getServiceId() {
serviceId=$(docker -H $1 ps -qf label=com.docker.swarm.service.name=$2)
$3=serviceId
return 0
}
我像这样执行这个功能
getServiceId $node1 $service1 retVal
错误来自第$3=serviceId
行。
它试图在bash上执行serviceId的值,认为它是一个bash命令。我的目标是返回变量serviceId中的值。
我该怎么做?
答案 0 :(得分:0)
试试这个:
function getServiceId() {
local serviceId
read serviceId < <(
docker -H $1 ps -qf label=com.docker.swarm.service.name=$2
)
printf -v $3 "%s" "$serviceId"
}
getServiceId $node1 $service1 retVal
这适用于此特定情况。但我喜欢使用read
为很多事情设置变量:
{ read foo ; read device total use free prct mpoint } < <(df -k /)
echo $use
或
# Work on DB
while IFS=$'\t' read id name label ;do
[ "$id" ] && (( id > 100 )) && {
# Doing something for entries with id > 100 ...
}
done < <(
sqlclient "SELECT id,name,label FROM ..."
)
但是关注:默认情况下read
将解释反斜杠\
作为转义字符(例如,擦除换行符)。见help read
:
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] Read a line from the standard input and split it into fields. Reads a single line from the standard input, or from file descriptor FD if the -u option is supplied. The line is split into fields as with word splitting, and the first word is assigned to the first NAME, the second word to the second NAME, and so on, with any leftover words assigned to the last NAME. Only the characters found in $IFS are recognized as word delimiters. If no NAMEs are supplied, the line read is stored in the REPLY variable. Options: -a array assign the words read to sequential indices of the array variable ARRAY, starting at zero -d delim continue until the first character of DELIM is read, rather than newline -e use Readline to obtain the line in an interactive shell -i text Use TEXT as the initial text for Readline -n nchars return after reading NCHARS characters rather than waiting for a newline, but honor a delimiter if fewer than NCHARS characters are read before the delimiter -N nchars return only after reading exactly NCHARS characters, unless EOF is encountered or read times out, ignoring any delimiter -p prompt output the string PROMPT without a trailing newline before attempting to read -r do not allow backslashes to escape any characters -s do not echo input coming from a terminal -t timeout time out and return failure if a complete line of input is not read within TIMEOUT seconds. The value of the TMOUT variable is the default timeout. TIMEOUT may be a fractional number. If TIMEOUT is 0, read returns immediately, without trying to read any data, returning success only if input is available on the specified file descriptor. The exit status is greater than 128 if the timeout is exceeded -u fd read from file descriptor FD instead of the standard input Exit Status: The return code is zero, unless end-of-file is encountered, read times out (in which case it's greater than 128), a variable assignment error occurs, or an invalid file descriptor is supplied as the argument to -u.
答案 1 :(得分:-1)
只需捕获getServiceId
函数的STDOUT。
function getServiceId() {
docker -H "$1" ps -qf "label=com.docker.swarm.service.name=$2"
}
serviceId="$(getServiceId "arg1" "arg2")"
echo "Service ID is $serviceId"
答案 2 :(得分:-1)
您不会从shell中的函数返回值;您写入标准输出,或设置全局变量。 (没有人说shell促进了良好的软件工程实践。)
getServiceId () {
docker -H "$1" ps -qf label=com.docker.swarm.service.name="$2"
}
serviceID=$(getServiceID)
或
getServiceID () {
serviceID=$(docker -H "$1" ps -qf label=com.docker.swarm.service.name="$2")
}