对一个变量两次取非的作用

取非运算与布尔转换

今天看到一行代码,首次见到不明其意,网上寻求解释,原网页http://www.360doc.com/content/12/0301/19/8302596_190912151.shtml

m_bIs3dMode = !!dwDimension;

如果变量dwDimension为零,!!dwDimension的结果还是零;

如果变量dwDimension为非零值,!!dwDimension的结果为1(壹);


取非两次,可将一个变量变为布尔值,确保返回值为0或1.

<think>好的,用户现在问的是在shell脚本中连续两次使用setenv对同一个环境变量会怎么样。首先,我需要确认用户提到的setenv是什么,因为在常见的shell中,比如Bash,设置环境变量通常用的是export命令,而setenv其实是C shell(比如tcsh)中的命令。这可能意味着用户正在使用C shell或者相关变体,或者可能混淆了不同shell的语法。 接下来,我需要考虑用户可能的背景。他们可能是在编写脚本时遇到了问题,或者在阅读别人的代码时看到了连续两次setenv同一个变量,想知道这样做的后果。用户可能对shell脚本的环境变量作用域和持久性不太清楚,或者想了解重复设置是否会导致覆盖或其他副作用。 然后,我要回忆不同shell之间的差异。在Bash中,export VAR=value用于设置环境变量,而C shell中使用setenv VAR value。如果用户使用的是Bash却错误地用了setenv,那可能语法错误,但如果是C shell,那么setenv是正确的。需要明确这一点,但用户之前的问题提到了export,所以可能这次的问题是在不同的上下文中,或者用户可能混淆了不同shell的命令。 接下来,回答连续两次setenv同一个变量的情况。需要说明每次调用setenv都会覆盖之前的值。例如,第一次设置VAR=value1,第二次设置VAR=value2,最终VAR的值是value2。同时,需要注意环境变量作用范围,即对当前shell及其后续子进程的影响。 另外,可能需要提醒用户,在C shell中,setenv和set的区别,set用于普通变量,setenv用于环境变量。如果用户错误地混合使用,可能会有不同的结果。同时,连续设置环境变量可能在某些情况下有用,比如根据条件动态修改变量值,或者在脚本的不同阶段更新变量。 还需要考虑用户可能的真实需求,比如他们是否想追加值而不是覆盖,例如PATH变量通常是用冒号分隔的,可能需要使用setenv PATH "${PATH}:/new/path"而不是直接覆盖。这时候连续两次setenv可能导致重复的路径,或者覆盖问题,需要说明正确的做法。 另外,如果用户是在不同的shell中切换,可能需要指出不同shell的语法差异,避免混淆。例如,Bash中使用export,而C shell使用setenv,并且语法不同。 最后,总结两种情况:覆盖更新和追加修改,强调覆盖是直接替换,而追加需要手动处理。同时,提醒注意shell的差异性,确保使用正确的命令。</think>在 Shell 脚本中,`setenv` 是 **C Shell(如 `tcsh` 或 `csh`)** 中用于设置环境变量的命令(类似于 Bourne Shell 系列中的 `export`)。如果你在脚本中连续两次使用 `setenv` 对同一个环境变量进行操作,其行为决于具体操作的目标和逻辑: --- ### 场景 1:两次 `setenv` 直接覆盖赋值 ```tcsh setenv MY_VAR "First Value" setenv MY_VAR "Second Value" ``` - **结果**:环境变量 `MY_VAR` 的值会被覆盖,最终值为 `"Second Value"`。 - **说明**:每次 `setenv` 都会直接更新变量的值,后续子进程或脚本中读到的是最后一次赋的值。 --- ### 场景 2:基于原有值的追加或修改 ```tcsh setenv PATH "/usr/bin" # 初始赋值 setenv PATH "$PATH:/usr/local/bin" # 在原有 PATH 后追加路径 ``` - **结果**:`PATH` 的值会变为 `/usr/bin:/usr/local/bin`。 - **说明**:第二次 `setenv` 利用了 `$PATH` 获当前值,并追加新路径。这种模式常用于动态更新环境变量(如 `PATH`、`LD_LIBRARY_PATH`)。 --- ### 注意事项 1. **作用域**: - `setenv` 设置的环境变量对当前 Shell 和所有后续启动的子进程生效。 - 连续修改会直接影响后续所有使用该变量的操作。 2. **覆盖风险**: - 如果两次 `setenv` 之间没有关联(如直接覆盖而追加),可能丢失之前的值。例如: ```tcsh setenv DATA "123" setenv DATA "456" # 完全覆盖,原值 "123" 丢失 ``` 3. **C Shell 语法差异**: - `setenv` 是 C Shell 特有的命令,Bourne Shell(如 `bash`/`sh`)中使用 `export`。例如: ```bash # 在 bash 中 export MY_VAR="First" export MY_VAR="Second" ``` 4. **动态更新场景**: - 若需保留旧值并追加内容,需显式引用原变量(如 `$PATH`),否则会直接替换。 --- ### 示例分析 ```tcsh # 第一次设置 setenv APP_HOME "/old/path" echo $APP_HOME # 输出 /old/path # 第二次设置(覆盖) setenv APP_HOME "/new/path" echo $APP_HOME # 输出 /new/path ``` - 最终只有最后一次设置的 `/new/path` 生效。 --- ### 总结 - 连续两次 `setenv` 对同一变量赋值时,**最后一次赋值会覆盖之前的值**。 - 若需保留旧值并扩展(如更新路径),需手动拼接(如 `$VAR:new_value`)。 - 确保理解当前 Shell 的类型(如 C Shell vs. Bourne Shell),语法可能不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值