cou=`ps -ef|grep "9161"|grep -v grep|wc -l` 为什么这条命令单独拿出来执行,echo $cou显示是1,放到脚本里面执行,echo $cou显示就变成3了?
时间: 2024-09-30 11:09:50 浏览: 23
这个命令的意思是获取当前进程中包含字符串"9161"的所有进程,并排除grep自身(grep -v grep),然后计算结果行数(`wc -l`),并将计数值赋给变量$cou。当将这行命令单独执行时,它会在命令行环境中运行,由于grep会返回匹配的结果行,所以echo $cou 显示的是1。
然而,在脚本中执行,尤其是shell脚本(bash或其他shell),这里有几个可能的原因导致`echo $cou` 显示变为了3:
1. **分词解析**:脚本环境下,bash 可能会以空格或者其他特殊字符分割执行语句,可能导致整个命令被执行多次,每个命令都生成一行输出,总计就是3次的计数。
2. **shell历史记录**:如果上一次执行过类似命令并将其添加到了历史记录中,再次敲入相同的命令可能会触发历史记录回放,这也会增加计数。
3. **后台进程**:如果在脚本中执行时,含有grep的部分可能在后台持续运行,而wc部分等待其完成后再打印结果,这时显示的可能是包括grep在内的所有进程行数。
4. **递归查找**:如果grep选项中包含了递归搜索(-R 或者 equivalent),那么它可能会找到其他匹配的进程,并计入计数。
要解决这个问题,你可以尝试在脚本中使用单引号 `'...` 来确保命令作为一个整体执行,或者加上`>/dev/null` 来禁止标准输出,只保留计数部分。例如:
```bash
cou=$(ps -ef | grep -v 'grep' | grep '9161' | wc -l; echo $cou)
```
这样就可以避免上述问题了。
相关问题
declare tName varchar2(1000); str varchar2(1000); cou number; indexStart number; begin tName:= 'Docdetail'; str:= 'select count(*) as int from tab where tname=upper('''|| tName||''')' ; dbms_output.put_line(str); execute immediate str into cou ; if cou>0 then begin str:= 'select nvl(max(id),0)+1000 from ' || tName ; execute immediate str into indexStart ; str:='create sequence ' || tName || '_id start with '|| indexStart ||' increment by 1 nomaxvalue nocache'; dbms_output.put_line(str); execute immediate str; end; end if ; end; / declare tName varchar2(1000); str varchar2(1000); cou number; indexStart number; begin tName:= 'ImageFile'; str:= 'select count(*) as int from tab where tname=upper('''|| tName||''')' ; dbms_output.put_line(str); execute immediate str into cou ; if cou>0 then begin str:= 'select nvl(max(imagefileid),0)+1000 from ' || tName ; execute immediate str into indexStart ; str:='create sequence ' || tName || '_id start with '|| indexStart ||' increment by 1 nomaxvalue nocache'; dbms_output.put_line(str); execute immediate str; end; end if ; end; / declare tName varchar2(1000); str varchar2(1000); cou number; indexStart number; begin tName:= 'docImageFile'; str:= 'select count(*) as int from tab where tname=upper('''|| tName||''')' ; dbms_output.put_line(str); execute immediate str into cou ; if cou>0 then begin str:= 'select nvl(max(id),0)+1000 from ' || tName ; execute immediate str into indexStart ; str:='create sequence ' || tName || '_id2 start with '|| indexStart ||' increment by 1 nomaxvalue nocache'; dbms_output.put_line(str); execute immediate str; end; end if ; end; / 这个sql是干嘛的
这段 SQL 语句是用来动态创建序列的。首先通过查询系统表 `tab`,判断指定的表名是否存在。如果存在,则查询指定表的最大 ID 值,并加上一个固定值作为序列的起始值;然后使用 `create sequence` 语句创建一个序列,名称为指定的表名加上 `_id` 后缀,起始值为上一步计算出的值,步长为 1,不设置最大值和缓存。这样可以保证每次向指定表中插入新记录时,自动生成唯一的 ID 值,避免了手动管理 ID 的麻烦。这段 SQL 中还包括了一些动态 SQL 的语法,使用 `execute immediate` 来执行动态生成的 SQL 语句。
class Country { private: char name[40],capital[40]; int population; public: Country( const char* cou=NULL,const char* cap=NONE,int pop=0 ); char GetName const( ); char GetCapital const( ); int GetPopulation const( ); void Set( const char* cou=Russia,const char* cap=Moscow,int pop=143000000 ); void Show(); }; Country::Country( const char* cou,const char* cap,int pop ) { strcpy(name,cou); strcpy(capital,cap); population=pop; } char Country::GetName const( ) { return name; } char Country::GetCapital const( ) { return capital; } int Country::GetPopulation const( ) { return population; } void Country::Set( const char* cou,const char* cap,int pop ) { strcpy(name,cou); strcpy(capital,cap); population=pop; } void Country::Show( ) { cout<<name<<"-"<<capital<<"-"<<population<<endl; } 这段代码是否有问题
这段代码存在一些问题:
1. 在构造函数 Country 和函数 GetName、GetCapital 中,返回的类型应该是 char* 而不是 char,因为成员变量 name 和 capital 都是 char 数组,需要返回数组首地址。
2. 在函数的参数列表中,出现了未定义的变量 NONE、Russia,应该改为字符串常量 "NONE" 和 "Russia"。
修改后的代码如下:
```
class Country {
private:
char name[40], capital[40];
int population;
public:
Country(const char* cou = NULL, const char* cap = "NONE", int pop = 0);
char* GetName() const;
char* GetCapital() const;
int GetPopulation() const;
void Set(const char* cou = "Russia", const char* cap = "Moscow", int pop = 143000000);
void Show();
};
Country::Country(const char* cou, const char* cap, int pop) {
strcpy(name, cou);
strcpy(capital, cap);
population = pop;
}
char* Country::GetName() const {
return name;
}
char* Country::GetCapital() const {
return capital;
}
int Country::GetPopulation() const {
return population;
}
void Country::Set(const char* cou, const char* cap, int pop) {
strcpy(name, cou);
strcpy(capital, cap);
population = pop;
}
void Country::Show() {
cout << name << "-" << capital << "-" << population << endl;
}
```
阅读全文