private ParsedExpression parseShell(String shell) {
		Assert.notNull(shell, "Shell must not be null");

		Set<String> namedParameters = new HashSet<String>();
		ParsedExpression parsedShell = new ParsedExpression(shell);

		char[] shellChars = shell.toCharArray();
		int namedParameterCount = 0;
		// int unnamedParameterCount = 0;
		// int totalParameterCount = 0;

		int i = 0;
		while (i < shellChars.length) {
			// 获取跳过注释后的有效表达式起始位置
			int skipToPosition = skipCommentsAndQuotes(shellChars, i);
			if (i != skipToPosition) {
				if (skipToPosition >= shellChars.length) {
					break;
				}
				i = skipToPosition;
			}
			char c = shellChars[i];
			// 判断当前的字符是否为参数起始符":"
			if (c == ':') {
				int j = i + 1;
				// 如果有连续多个“:”，只有最后一个才会作为参数的起始符
				if (j < shellChars.length && shellChars[j] == ':') {
					i++;
					continue;
				}
				j = endIndexOfParameter(shellChars, j);
				if (j - i > 1) {
					String parameter = shell.substring(i + 1, j);
					namedParameterCount = addNamedParameter(namedParameters, parameter, namedParameterCount);
					parsedShell.addNamedParameter(parameter, i, j);
					// totalParameterCount++;
				}
				i = j - 1;
			}
			i++;
		}
		// parsedShell.setNamedParameterCount(namedParameterCount);
		// parsedShell.setUnnamedParameterCount(unnamedParameterCount);
		// parsedShell.setTotalParameterCount(totalParameterCount);
		return parsedShell;
	}