小编Luc*_*one的帖子

检查数组中索引或键的最简单方法是什么?

使用:

set -o nounset
Run Code Online (Sandbox Code Playgroud)

1)有一个索引数组,如:

myArray=( "red" "black" "blue" )
Run Code Online (Sandbox Code Playgroud)

检查元素1是否设置的最短方法是什么?
我有时会使用以下内容:

test "${#myArray[@]}" -gt "1" && echo "1 exists" || echo "1 doesn't exist"
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个首选的.

2)如何处理非连续索引?

myArray=()
myArray[12]="red"
myArray[51]="black"
myArray[129]="blue"
Run Code Online (Sandbox Code Playgroud)

如何快速检查'51'已经设置好了?

3)如何处理关联数组?

declare -A myArray
myArray["key1"]="red"
myArray["key2"]="black"
myArray["key3"]="blue"
Run Code Online (Sandbox Code Playgroud)

例如,如何快速检查'key2'是否已被使用?

谢谢

编辑
最简单的方式在我看来:

if test "${myArray['key_or_index']+isset}"
    then
        echo "yes"
    else
        echo "no"
fi;
Run Code Online (Sandbox Code Playgroud)

这适用于索引和关联数组.set -o nounset没有显示错误.
感谢headDown为headup.

arrays indexing bash key

77
推荐指数
5
解决办法
6万
查看次数

如何保持两个文件夹自动同步?

我想要一个文件夹的同步副本及其所有子树.

它应该以这种方式自动工作:每当我创建,修改或删除原始文件夹中的内容时,这些更改都应自动应用于sync-folder.

哪个是完成此任务的最佳方法?

顺便说一句:我在Ubuntu 12.04上

最终目标是拥有一个独立的实时备份副本,而无需使用符号链接或mount.我使用Ubuntu One来同步我的计算机之间的数据,过了一段时间出了问题,我的所有数据都在同步过程中丢失了.

所以我想进一步增加一步来保留我的数据的备份副本:

  • 我把我的数据保存在"文件夹A"中
  • 我需要我当前问题的答案来创建"文件夹A"到"文件夹B"的单向同步(cron带有rsync?的脚本可能是?).我需要它只是从A到B的单向方式,对B的任何更改都不能应用于A.
  • 我只是将"文件夹B"与Ubuntu One保持同步

    .这样,A中的任何更改都将被应用到B,这将从U1检测到并同步到云.如果出现任何问题并且U1在B上删除我的数据,我总是将它们放在A.

受到lanzz评论的启发,另一个想法可能是在启动时运行rsync来备份Ubuntu One下的文件夹内容,并在rsync完成后启动Ubuntu One.

你觉得怎么样?如何知道rsync什么时候结束?

bash synchronization

63
推荐指数
4
解决办法
8万
查看次数

如何在magento中打印集合mysql查询

假设我有一个类似的集合:

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ...
            ->load();
Run Code Online (Sandbox Code Playgroud)

如何打印执行的实际MySQL代码?

debugging magento

12
推荐指数
3
解决办法
5万
查看次数

如何禁用页面的滚动条?

如何禁用页面的滚动条.

并禁用此按钮.

替代文字

javascript css jquery dom scroll

9
推荐指数
3
解决办法
4万
查看次数

源文件如何继承陷阱DEBUG?

运行以下代码段:

#!/bin/bash

function preexec ()
{
    echo -e "\n-->preexec command: $BASH_COMMAND"
}
trap 'preexec' DEBUG

function testfunc ()
{
    echo "testfunc called $1"
}

testfunc "main"
source "source.sh"

exit 0
Run Code Online (Sandbox Code Playgroud)


其中source.sh是

#!/bin/bash

testfunc "source"
Run Code Online (Sandbox Code Playgroud)


得到:

-->preexec command: testfunc "main"
testfunc called main

-->preexec command: source "source.sh"
testfunc called source

-->preexec command: exit 0
Run Code Online (Sandbox Code Playgroud)


这意味着源文件中的每个命令都不会被DEBUG陷阱捕获.
事实上,如果我添加该行

trap 'preexec' DEBUG
Run Code Online (Sandbox Code Playgroud)

在source.sh内部作为第二行,一切都按照需要工作(源文件中的命令也被捕获).

如何将此作为默认行为,以避免为我需要提供的任何文件重复上述行?换句话说:有没有机会告诉源文件继承DEBUG陷阱?

debugging bash bash-trap

6
推荐指数
1
解决办法
1225
查看次数

如何使用bash在两个已知行块(如果之前尚未插入)之间的文件中插入一行?

我写了一个bash脚本,可以根据我的需要修改php.ini.
现在我必须引入一个新的变化,我找不到一个明确的解决方案.

我需要修改php.ini才能插入(如果以前没有插入的话)

extension="memcache.so" 
Run Code Online (Sandbox Code Playgroud)


块之间

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)

和块

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)

可能就在第二个之前.
有人可以帮我吗?提前致谢

编辑:使用解决

if ! grep -Fxq 'extension="memcache.so"' 'php.ini'; then
    line=$(cat 'php.ini' | grep -n '; Module Settings ;' | grep -o '^[0-9]*')
    line=$((line - 2))
    sudo sed -i ${line}'i\extension="memcache.so"' 'php.ini'
fi
Run Code Online (Sandbox Code Playgroud)

bash awk sed file-manipulation

5
推荐指数
2
解决办法
8476
查看次数

Bash:如何使用sed只替换文件中的最后一次出现?

拥有包含重复注释行的文件,例如:

# ScriptAlias /cgi-bin/ "somepath"
# ScriptAlias /cgi-bin/ "otherpath"
Run Code Online (Sandbox Code Playgroud)

我想在最后一次出现之后添加一行

# ScriptAlias /cgi-bin/ "somepath"
# ScriptAlias /cgi-bin/ "otherpath"
ScriptAlias /cgi-bin/ "mypath"
Run Code Online (Sandbox Code Playgroud)

为此,我正在使用此命令:

sed -i 's:^\(.*ScriptAlias /cgi-bin/.*\):\1 \nScriptAlias /cgi-bin/ "mypath":' file
Run Code Online (Sandbox Code Playgroud)

但这导致在每次出现后添加我的线条,如:

# ScriptAlias /cgi-bin/ "somepath"
ScriptAlias /cgi-bin/ "mypath"
# ScriptAlias /cgi-bin/ "otherpath"
ScriptAlias /cgi-bin/ "mypath"
Run Code Online (Sandbox Code Playgroud)

我怎么能告诉sed只替换最后一次出现?

编辑:
如果没有办法用sed解决它(如评论中所述),请提供相同结果的替代方案,谢谢.



编辑:
重复的线条可以分开,并且它们之间有其他线条

# ScriptAlias /cgi-bin/ "somepath"
# ScriptAlias /cgi-bin/ "otherpath"

# ScriptAlias /cgi-bin/ "another-path"
ScriptAlias /foo/ "just-jump"
# ScriptAlias /cgi-bin/ "that's the last"
Run Code Online (Sandbox Code Playgroud)

bash awk replace sed last-occurrence

5
推荐指数
1
解决办法
5620
查看次数

mysql:如何将乘法部分相加

有这样的表:

sold_items:

code   | size   | quantity 
abc123 | small  | 4
abc123 | medium | 2  
xyz987 | small  | 3
xyz987 | medium | 1
xyz987 | large  | 2
Run Code Online (Sandbox Code Playgroud)

价目单价目表:

code   | size   | price 
abc123 | small  | 5
abc123 | medium | 7  
abc123 | large  | 9 
xyz987 | small  | 10
xyz987 | medium | 13
xyz987 | large  | 15
Run Code Online (Sandbox Code Playgroud)

这将是你最好的(更快的查询)方法

结果:

code   | sold_items | cash
abc123 | 6          | 34 …
Run Code Online (Sandbox Code Playgroud)

mysql sum multiplying

5
推荐指数
1
解决办法
122
查看次数

是否可以避免执行某个命令?

我必须避免在bash脚本中执行某个命令.
我想用一个preexec陷阱来做到这一点.

假设我想避免命令'source'仅用于axample.我做的基本上是以下几点:

#!/bin/bash

function preexec ()
{
    if test $( echo "$BASH_COMMAND" | cut -d " " -f1 ) == "source"
        then
            echo ">>> do not execute this"
        else
            echo ">>> execute this"

    fi
}
trap 'preexec' DEBUG

echo "start"
source "source.sh"
echo "go on"

exit 0
Run Code Online (Sandbox Code Playgroud)

这个想法很好,但此时我不知道如何避免执行所述命令.
不知道怎么解决这个问题?

bash

5
推荐指数
1
解决办法
388
查看次数

Bash:如何在文件的块中检查和插入字符串

在http.conf文件中有一个块,如:

<IfModule mime_module>
    ...
</IfModule>
Run Code Online (Sandbox Code Playgroud)

假设使用bash,我该如何检查以下行

AddHandler application/x-httpd-php .php
Run Code Online (Sandbox Code Playgroud)

已经添加到上一个块中,
如果没有,我怎样才能在其底部添加它

<IfModule mime_module>
    ...
    AddHandler application/x-httpd-php .php
</IfModule>
Run Code Online (Sandbox Code Playgroud)

此块位于文件的中间:
文件内容不以此块开头或结尾.


编辑:
为了使这更难,我意识到我还需要进一步检查:很遗憾在我的问题中错过了它.如果上述行已作为注释行存在于所述块中

# AddHandler application/x-httpd-php .php
Run Code Online (Sandbox Code Playgroud)

(char#可能是该行的第一个char,或者之前可能有一些间隔,因为它可能在AddHandler的char A之前有或没有一些空格),我只需要取消注释它,否则我继续添加如上所述.

bash awk

4
推荐指数
1
解决办法
566
查看次数