繁体   English   中英

如何访问 Shell 脚本中的变量

[英]How to Access a variable in a Shell script

我目前坚持如何执行以下操作:

我有一个如下所示的settings文件:

USER_ID=12
ROLE=admin
STARTED=10/20/2010
...

我需要访问角色和 map 角色到下面脚本中的变量之一。 在我将使用该变量调用打开具有正确名称的文档之后。

测试.sh

#!/bin/sh

ADMIN=master_doc
STAFF=staff_doc
GUEST=welcome_doc    

echo "accessing role type"
cd /setting

#open `settings` file to access role?
#call correct service
#chmod 555 master_doc.service 

有没有办法像 javascript 那样使用 bash 插入字符串? 另外,我猜我需要遍历设置文件才能访问角色?

使用bashgrep并假设settings文件恰好有一行以ROLE=开头:

#!/bin/bash

admin=master_doc
staff=staff_doc
guest=welcome_doc

cd /setting || exit
role=$(grep '^ROLE=' settings)
role=${role#*=}
echo chmod 555 "${!role}.service"

在确保它按预期工作后放下echo
查看Shell 参数扩展以进行indirect expansion

据我了解,您想从settings获取变量,使用$role作为对$admin的间接引用,即master_doc ,然后将其转换为字符串master_doc.service

首先,我推荐使用 关联数组而不是间接数组,因为它更简洁。

您可以使用source从另一个文件中获取变量,以及函数和其他内容。

最后,要取消引用变量,您需要使用美元符号,例如$role 变量引用在双引号内展开,所以这相当于字符串插值。

#!/bin/bash

# Associative array with doc names
declare -A docs=(
    [admin]=master_doc
    [staff]=staff_doc
    [guest]=welcome_doc
) 

echo "accessing role type"
cd setting || exit

source settings  # Import variables 
true "${ROLE?}"  # Exit if unset

echo chmod 555 "${docs[$ROLE]}.service"  # Select from associative array
# ^ Using "echo" to test. Remove if the script works properly.

您可以获取设置文件以加载变量:

source settings

然后你可以在你的脚本中使用它们:

chmod 555 "${admin}.service"  # will replace ${admin} with master_doc

我当然会使用source(.)

#!/bin/sh
ADMIN=master_doc
STAFF=staff_doc
GUEST=welcome_doc

echo "accessing role type"
. /setting/settings 2> /dev/null || { echo 'Settings file not found!'; exit 1; }

role=${ROLE^^} # upercase rolename
echo ${!role}.service # test echo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM