shell脚本怎么将一个字符串变量变成指令执行,最后三行好像都不行 IFS='' read -p "请输入mysql库名:" h1 read -p "请输入mysql表名:" h2 read -p "请输入${h2}表的主键:" h3 read -p "请输入引用hdfs文件的绝对路径:" h4 read -p "请输入分隔符:" h5 sqoop="/opt/module/sqoop-1.4.7.bin__hadoop-2.6.0/bin/sqoop export --connect" sqoop+=" \"jdbc:mysql://hadoop-single:3306/${h1}?characterEncoding=utf8\"" sqoop+=" --username root --password root --table ${h2}" if [ $h3 != q ] then sqoop+=" --update-key ${h3}" fi sqoop+=" --update-mode allowinsert --export-dir ${h4} --input-null-string '\\\N' --input-null-non-string '\\\N'" seq=" --fields-terminated-by " seq+=" \"${h5}\"" sqoop+=${seq} # $(${sqoop}) # `${sqoop}` # `$sqoop`
时间: 2023-08-23 16:07:14 浏览: 59
要将一个字符串变量作为指令执行,可以使用以下几种方式:
1. 使用`eval`命令:
```bash
eval "$sqoop"
```
2. 使用`source`命令:
```bash
source <(echo "$sqoop")
```
3. 使用反引号(``)或 `$()` 执行命令替换:
```bash
`$sqoop`
$($sqoop)
```
这些方法中,`eval`是最常见的方式,它会执行字符串中的所有命令。但是需要注意,使用`eval`时要确保字符串中的内容是可信的,以避免潜在的安全风险。
另外,你在最后三行中的尝试都有一些问题:
- `$(${sqoop})`:这样写是不正确的语法。
- ```${sqoop}```:反引号应该包裹整个命令,而不是变量名。
- `$sqoop`:这样写只会输出变量的值,而不会执行该命令。
所以,建议使用上面提到的方法来执行字符串变量中的指令。
相关问题
IFS=: read -r user _ _ _ _ home shell;
这行代码用于从 `/etc/passwd` 文件中读取一行用户信息,并将其分割成多个字段。其中 `IFS` 变量定义了字段的分隔符,这里将其设置为冒号 `:`,因为 `/etc/passwd` 文件中的每一行都是由冒号分隔的字段组成。
接着,`read` 命令将从标准输入流中读取一行用户信息,并将其分割成多个字段,这些字段分别存储在 `user`、`_`、`_`、`_`、`_`、`home` 和 `shell` 变量中。其中,`_` 表示一个占位符,表示我们不需要这个字段,因为在 `/etc/passwd` 文件中,第二个字段是密码哈希值,我们不需要使用它。
因此,这行代码实际上是在获取用户的用户名、主目录和登录 shell 信息,其他字段都被忽略了。
写一个shell脚本,将df -h中占比大于百分之40的那一行打印出来
当然,我可以帮你写一个Shell脚本来实现这个功能。下面是一个示例脚本:
```shell
#!/bin/bash
# 执行df -h命令,并将结果存储到变量output中
output=$(df -h)
# 使用while循环遍历每一行输出
while IFS= read -r line; do
# 判断当前行是否包含百分比大于40的信息
if [[ $line =~ [4-9][0-9]%|[1-9][0-9][0-9]% ]]; then
# 如果是,则打印该行信息
echo "$line"
fi
done <<< "$output"
```
将以上代码保存为一个shell脚本文件(例如`df_check.sh`),并赋予执行权限(`chmod +x df_check.sh`)。然后在终端中执行该脚本(`./df_check.sh`),即可打印出占比大于百分之40的行。
请注意,该脚本使用正则表达式来匹配百分比大于40的行,因此可能会有一些边界情况未考虑到。你可以根据实际情况进行调整。