在争论中运行带有双引号和单引号的Shell脚本?

时间:2017-03-28 16:49:21

标签: shell

我还是shell脚本的新手。我在shell中的参数中使用引号运行这一行代码时遇到了麻烦。有没有其他方法来运行这行代码?我以root用户身份运行它。我得到的代码在执行时没有运行。

su - nfoadm -c ""hdbsql -CQajx -U DEFAULT "select entry_id, entry_type_name, utc_start_time, utc_end_time, state_name, message from M_BACKUP_CATALOG where entry_type_name = 'complete data backup' order by backup_id"""

基本上我想su到nfoadm然后执行hdbsql的整个命令。

2 个答案:

答案 0 :(得分:0)

试试这个:

su - nfoadm -c 'hdbsql -CQajx -U DEFAULT "select entry_id, entry_type_name, utc_start_time, utc_end_time, state_name, message from M_BACKUP_CATALOG where entry_type_name = \'complete data backup\' order by backup_id"'

答案 1 :(得分:0)

最佳做法是让shell为您做引用,而不是自己尝试。

在bash中,执行此操作的理想方法是printf -v varname '%q ' command with args...,它会将一个字符串放入varname

#!/bin/bash
cmd=( hdbsql -CQajx -U DEFAULT "select entry_id, entry_type_name, utc_start_time, utc_end_time, state_name, message from M_BACKUP_CATALOG where entry_type_name = 'complete data backup' order by backup_id" )
printf -v cmd_q '%q ' "${cmd[@]}"
su - nfoadm -c "$cmd"

如果你没有bash,printf可以在命令替换中使用; ksh93将对此进行优化,以避免命令替换所需的通常的fork成本。

#!/bin/ksh
cmd=( hdbsql -CQajx -U DEFAULT "select entry_id, entry_type_name, utc_start_time, utc_end_time, state_name, message from M_BACKUP_CATALOG where entry_type_name = 'complete data backup' order by backup_id" )
cmd_q=$(printf '%q ' "${cmd[@]}")
su - nfoadm -c "$cmd"

如果您需要处理没有非POSIX扩展名的shell,请考虑使用sudo而不是su

#!/bin/sh
sudo -u nfoadm hdbsql -CQajx -U DEFAULT "select entry_id, entry_type_name, utc_start_time, utc_end_time, state_name, message from M_BACKUP_CATALOG where entry_type_name = 'complete data backup' order by backup_id"