shell命令declare和eval的使用
一. declare命令
declare 是 Bash 的一个内置命令,用于声明变量并设置其属性。它提供了比普通变量声明更强大的功能,比如指定变量类型、创建数组、设置变量的只读属性等
1.基本语法
declare [选项] [变量名=[值]]
-a:声明一个索引数组(普通数组)。
-A:声明一个关联数组(键值对数组)。
-i:声明一个整数变量。
-r:将变量声明为只读。
-p:打印变量的声明信息。
-x:将变量导出为环境变量。
2. 声明普通变量
declare var="Hello"
echo $var
3. 声明整数变量
declare -i num=10
echo $num
4. 声明索引数组
declare -a fruits=("apple" "banana" "cherry")
echo ${fruits[1]}
打印所有键: echo ${!fruits[@]}
打印所有值: echo ${fruits[@]}
5. 声明关联数组(键值对形式)
declare -A user_hosts
user_hosts["alice"]="test1,test2"
user_hosts["bob"]="test3"
echo ${user_hosts["alice"]}
打印所有键: echo ${!user_hosts[@]}
打印所有值: echo ${user_hosts[@]}
6. 声明只读变量
declare -r readonly_var="Cannot change"
7. 打印变量声明信息
declare -p var
8. 导出变量为环境变量
declare -x export_var="Exported"
echo $export_var
9.动态变量名(使用变量的值,作为新变量的名)
varname="myvar"
declare "$varname=10"
echo $myvar
10.删除变量用unset
unset 变量名
二.
eval 是 Bash 中的一个非常强大的内置命令,它用于将字符串作为命令执行。
1.基本用法
eval [命令字符串]
2.动态构造和执行命令
command="echo Hello"
eval $command
3.动态变量赋值
varname="myvar"
eval "$varname=10"
echo $myvar
三. 应用
打印出来有那些用户在test1 test2 test3 test4上
格式:【用户名:主机n】
#/bin/bash
declare -A user_hosts
for i in test1 test2 test3 test4;do
data=$(cat /etc/passwd 2> /dev/null)
data=$(echo "$data" | grep -v '/sbin/nologin'| grep bash | awk -F':' '{print $1}')
for user in $data; do
if [[ ! "${user_hosts[$user]}" =~ "$i" ]]; then
if [[ -n "${user_hosts[$user]}" ]]; then
user_hosts[$user]="${user_hosts[$user]},$i"
else
user_hosts[$user]="$i"
fi
fi
done
done
for user in "${!user_hosts[@]}"; do
echo "$user: ${user_hosts[$user]}"
echo
done

浙公网安备 33010602011771号