我还是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的整个命令。
答案 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"